summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuochun Huang <hero.huang@rock-chips.com>2019-04-12 11:18:40 +0800
committerGuochun Huang <hero.huang@rock-chips.com>2019-04-12 11:18:40 +0800
commit5b99639235f57149cbbbbbd629c3af58c994e139 (patch)
treedfb11d09c9de986358d8de11d390126100e05d80
parent314d43c94ff2a64cf69871e776754c63a9a5743a (diff)
parent0436a29d64ac791fefc764fadc7e64ba16bb6b25 (diff)
Merge remote-tracking branch 'remotes/rk3399/next-dev' into rk3399-pie-gms-express-baseline
-rw-r--r--Makefile7
-rw-r--r--arch/arm/dts/px30-evb.dts15
-rw-r--r--arch/arm/dts/px30.dtsi22
-rw-r--r--arch/arm/dts/rk1808-evb.dts23
-rw-r--r--arch/arm/dts/rk1808.dtsi26
-rw-r--r--arch/arm/dts/rk3229-evb.dts13
-rw-r--r--arch/arm/dts/rk322x-u-boot.dtsi14
-rw-r--r--arch/arm/dts/rk322x.dtsi1
-rw-r--r--arch/arm/dts/rk3288-u-boot.dtsi4
-rw-r--r--arch/arm/dts/rk3288.dtsi1
-rw-r--r--arch/arm/dts/rk3308-evb.dts19
-rw-r--r--arch/arm/dts/rk3308.dtsi42
-rw-r--r--arch/arm/dts/rk3328-u-boot.dtsi1
-rw-r--r--arch/arm/dts/rk3368-px5-evb-u-boot.dtsi29
-rw-r--r--arch/arm/dts/rk3399-evb.dts4
-rw-r--r--arch/arm/dts/rk3399pro-npu-evb.dts4
-rw-r--r--arch/arm/dts/rv1108-evb.dts2
-rw-r--r--arch/arm/dts/rv1108-u-boot.dtsi27
-rw-r--r--arch/arm/dts/rv1108.dtsi1
-rw-r--r--arch/arm/include/asm/arch-rockchip/cru_rk1808.h24
-rw-r--r--arch/arm/include/asm/arch-rockchip/cru_rk3308.h17
-rw-r--r--arch/arm/include/asm/arch-rockchip/cru_rk3368.h4
-rw-r--r--arch/arm/include/asm/arch-rockchip/param.h22
-rw-r--r--arch/arm/include/asm/arch-rockchip/rk_atags.h46
-rw-r--r--arch/arm/lib/crt0_64.S18
-rw-r--r--arch/arm/lib/stacktrace.c4
-rw-r--r--arch/arm/lib/stacktrace_64.c4
-rw-r--r--arch/arm/mach-rockchip/Kconfig30
-rw-r--r--arch/arm/mach-rockchip/Makefile1
-rw-r--r--arch/arm/mach-rockchip/board.c144
-rw-r--r--arch/arm/mach-rockchip/boot_mode.c2
-rw-r--r--arch/arm/mach-rockchip/memblk.c66
-rw-r--r--arch/arm/mach-rockchip/param.c140
-rwxr-xr-xarch/arm/mach-rockchip/resource_img.c103
-rw-r--r--arch/arm/mach-rockchip/rk3308/rk3308.c5
-rw-r--r--arch/arm/mach-rockchip/rk3368/rk3368.c33
-rw-r--r--arch/arm/mach-rockchip/rk_atags.c192
-rw-r--r--arch/arm/mach-rockchip/rv1108/rv1108.c21
-rw-r--r--arch/arm/mach-rockchip/sdram_common.c227
-rw-r--r--arch/arm/mach-rockchip/spl.c10
-rw-r--r--arch/arm/mach-rockchip/tpl.c6
-rwxr-xr-xcmd/bootrkp.c2
-rw-r--r--cmd/dvfs.c3
-rw-r--r--cmd/fastboot.c10
-rw-r--r--cmd/optee.c12
-rw-r--r--cmd/rockusb.c2
-rw-r--r--common/Kconfig5
-rw-r--r--common/android_bootloader.c131
-rw-r--r--common/attestation_key.c22
-rw-r--r--common/board_f.c4
-rw-r--r--common/board_r.c10
-rw-r--r--common/boot_rkimg.c66
-rw-r--r--common/console.c12
-rw-r--r--common/fdt_support.c5
-rw-r--r--common/image-android.c39
-rw-r--r--common/image-fdt.c23
-rw-r--r--common/spl/spl_fit.c2
-rw-r--r--configs/evb-aarch32-rk3308_defconfig3
-rw-r--r--configs/evb-px30_defconfig9
-rw-r--r--configs/evb-px5_defconfig54
-rw-r--r--configs/evb-rk3036_defconfig1
-rw-r--r--configs/evb-rk3229_defconfig1
-rw-r--r--configs/evb-rk3288-rk1608_defconfig2
-rw-r--r--configs/evb-rk3308_defconfig3
-rw-r--r--configs/evb-rk3326_defconfig3
-rw-r--r--configs/evb-rk3328_defconfig10
-rw-r--r--configs/evb-rk3399_defconfig2
-rw-r--r--configs/evb-rv1108_defconfig9
-rw-r--r--configs/px30_defconfig8
-rw-r--r--configs/rk1808_defconfig6
-rw-r--r--configs/rk3036_defconfig1
-rw-r--r--configs/rk3126_defconfig2
-rw-r--r--configs/rk3128x_defconfig1
-rw-r--r--configs/rk322x_defconfig4
-rw-r--r--configs/rk3288_defconfig17
-rw-r--r--configs/rk3308-aarch32_defconfig4
-rw-r--r--configs/rk3308_defconfig4
-rw-r--r--configs/rk3326_defconfig5
-rw-r--r--configs/rk3328_defconfig8
-rw-r--r--configs/rk3368_defconfig10
-rwxr-xr-xconfigs/rk3399_defconfig5
-rw-r--r--configs/rk3399pro-npu_defconfig3
-rw-r--r--configs/rk3399pro_defconfig4
-rw-r--r--disk/part_rkparm.c2
-rw-r--r--drivers/clk/rockchip/clk_px30.c85
-rw-r--r--drivers/clk/rockchip/clk_rk1808.c107
-rw-r--r--drivers/clk/rockchip/clk_rk3128.c2
-rw-r--r--drivers/clk/rockchip/clk_rk3288.c18
-rw-r--r--drivers/clk/rockchip/clk_rk3308.c89
-rw-r--r--drivers/clk/rockchip/clk_rk3368.c15
-rw-r--r--drivers/clk/rockchip/clk_rk3399.c20
-rw-r--r--drivers/cpu/Kconfig12
-rw-r--r--drivers/cpu/Makefile2
-rw-r--r--drivers/cpu/amp-uclass.c162
-rw-r--r--drivers/cpu/rockchip_amp.c130
-rw-r--r--drivers/input/Kconfig2
-rw-r--r--drivers/input/adc_key.c113
-rw-r--r--drivers/input/gpio_key.c130
-rw-r--r--drivers/input/key-uclass.c349
-rw-r--r--drivers/input/rk8xx_pwrkey.c34
-rw-r--r--drivers/input/rk_key.c156
-rw-r--r--drivers/irq/irq-gpio-switch.h2
-rw-r--r--drivers/irq/irq-gpio.c12
-rw-r--r--drivers/misc/Kconfig7
-rw-r--r--drivers/misc/Makefile1
-rw-r--r--drivers/misc/rockchip-efuse.c114
-rw-r--r--drivers/misc/rockchip-otp.c213
-rw-r--r--drivers/mmc/dw_mmc.c34
-rw-r--r--drivers/mmc/rpmb.c2
-rw-r--r--drivers/mtd/nand/Kconfig8
-rw-r--r--drivers/mtd/nand/Makefile2
-rw-r--r--drivers/mtd/nand/nand_bbt.c6
-rw-r--r--drivers/mtd/nand/rockchip_nand.c36
-rw-r--r--drivers/mtd/nand/rockchip_nand_v9.c691
-rw-r--r--drivers/net/gmac_rockchip.c212
-rw-r--r--drivers/power/charge_animation.c37
-rw-r--r--drivers/power/dvfs/dvfs-uclass.c3
-rw-r--r--drivers/power/fuel_gauge/fg_rk817.c7
-rw-r--r--drivers/power/pmic/rk8xx.c10
-rw-r--r--drivers/ram/Kconfig2
-rw-r--r--drivers/ram/Makefile2
-rw-r--r--drivers/ram/ramdisk_ro.c (renamed from drivers/ram/ramdisk_readonly.c)24
-rw-r--r--drivers/ram/rockchip/Makefile1
-rw-r--r--drivers/ram/rockchip/rockchip_sdram.c13
-rw-r--r--drivers/ram/rockchip/sdram_rk3399.c15
-rw-r--r--drivers/ram/rockchip/sdram_rv1108.c15
-rw-r--r--drivers/rkflash/flash.c81
-rw-r--r--drivers/rkflash/flash.h1
-rw-r--r--drivers/rkflash/flash_com.h5
-rw-r--r--drivers/rkflash/rk_sftl_arm_v7.S7484
-rw-r--r--drivers/rkflash/rk_sftl_arm_v8.S5307
-rw-r--r--drivers/usb/gadget/f_fastboot.c34
-rw-r--r--drivers/usb/phy/rockchip_usb2_phy.c3
-rw-r--r--drivers/video/drm/rockchip_display.c42
-rw-r--r--drivers/video/drm/rockchip_display.h2
-rw-r--r--drivers/watchdog/Kconfig6
-rw-r--r--drivers/watchdog/Makefile3
-rw-r--r--drivers/watchdog/rockchip_wdt.c164
-rw-r--r--include/amp.h29
-rwxr-xr-xinclude/android_avb/avb_ab_flow.h555
-rw-r--r--include/android_avb/rk_avb_ops_user.h39
-rw-r--r--include/bidram.h81
-rw-r--r--include/boot_rkimg.h3
-rw-r--r--include/configs/evb_px5.h1
-rw-r--r--include/configs/rk3368_common.h5
-rw-r--r--include/configs/rv1108_common.h2
-rw-r--r--include/console.h2
-rw-r--r--include/dm/uclass-id.h1
-rw-r--r--include/dt-bindings/clock/rk1808-cru.h1
-rw-r--r--include/image.h2
-rw-r--r--include/irq-platform.h3
-rw-r--r--include/key.h26
-rw-r--r--include/lmb.h2
-rw-r--r--include/memblk.h63
-rw-r--r--include/optee_include/OpteeClientInterface.h2
-rw-r--r--include/optee_include/OpteeClientMem.h2
-rw-r--r--include/optee_include/OpteeClientRkFs-v2.h3
-rw-r--r--include/optee_include/OpteeClientRkFs.h4
-rw-r--r--include/power/rk8xx_pmic.h1
-rw-r--r--include/rk_timer_irq.h9
-rw-r--r--include/sysmem.h120
-rw-r--r--lib/Kconfig6
-rw-r--r--lib/Makefile1
-rwxr-xr-xlib/avb/libavb/avb_sysdeps_posix.c180
-rwxr-xr-xlib/avb/libavb_ab/avb_ab_flow.c1063
-rw-r--r--[-rwxr-xr-x]lib/avb/libavb_atx/avb_atx_validate.c874
-rwxr-xr-xlib/avb/libavb_user/Kconfig19
-rw-r--r--lib/avb/libavb_user/avb_ops_user.c2
-rwxr-xr-xlib/avb/rk_avb_user/Kconfig7
-rw-r--r--lib/avb/rk_avb_user/rk_avb_ops_user.c74
-rw-r--r--lib/bidram.c445
-rw-r--r--lib/fdtdec.c10
-rw-r--r--lib/optee_clientApi/OpteeClientApiLib.c15
-rw-r--r--lib/optee_clientApi/OpteeClientInterface.c392
-rw-r--r--lib/optee_clientApi/OpteeClientMem.c24
-rw-r--r--lib/optee_clientApi/OpteeClientRPC.c5
-rw-r--r--lib/optee_clientApi/OpteeClientRkFs-v2.c395
-rw-r--r--lib/optee_clientApi/OpteeClientRkFs.c422
-rw-r--r--lib/sysmem.c521
-rwxr-xr-xmake.sh50
-rwxr-xr-xscripts/mkkrnlimgbin0 -> 13214 bytes
-rwxr-xr-xscripts/stacktrace.sh6
-rw-r--r--tools/rockchip/boot_merger.c6
-rw-r--r--tools/rockchip/loaderimage.c2
-rw-r--r--tools/rockchip/trust_merger.c6
185 files changed, 14138 insertions, 9273 deletions
diff --git a/Makefile b/Makefile
index efedc288d4..e121dbd4d9 100644
--- a/Makefile
+++ b/Makefile
@@ -654,6 +654,7 @@ libs-y += fs/
libs-y += net/
libs-y += disk/
libs-y += drivers/
+libs-y += drivers/cpu/
libs-y += drivers/dma/
libs-y += drivers/gpio/
libs-y += drivers/i2c/
@@ -923,7 +924,11 @@ endif
quiet_cmd_copy = COPY $@
cmd_copy = cp $< $@
-u-boot.dtb: dts/dt.dtb
+ifeq ($(CONFIG_USING_KERNEL_DTB),y)
+u-boot.dtb: dts/dt-spl.dtb FORCE
+else
+u-boot.dtb: dts/dt.dtb FORCE
+endif
$(call cmd,copy)
OBJCOPYFLAGS_u-boot.hex := -O ihex
diff --git a/arch/arm/dts/px30-evb.dts b/arch/arm/dts/px30-evb.dts
index 43ef6ee50e..906c1f1f72 100644
--- a/arch/arm/dts/px30-evb.dts
+++ b/arch/arm/dts/px30-evb.dts
@@ -90,8 +90,23 @@
248 249 250 251 252 253 254 255>;
default-brightness-level = <200>;
};
+
+ vcc_phy: vcc-phy-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc_phy";
+ regulator-always-on;
+ regulator-boot-on;
+ };
};
+&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";
+};
&i2c0 {
status = "okay";
diff --git a/arch/arm/dts/px30.dtsi b/arch/arm/dts/px30.dtsi
index 668eb51257..55cd85cc80 100644
--- a/arch/arm/dts/px30.dtsi
+++ b/arch/arm/dts/px30.dtsi
@@ -87,6 +87,13 @@
};
};
+ gmac_clkin: external-gmac-clock {
+ compatible = "fixed-clock";
+ clock-frequency = <50000000>;
+ clock-output-names = "gmac_clkin";
+ #clock-cells = <0>;
+ };
+
psci {
compatible = "arm,psci-1.0";
method = "smc";
@@ -792,7 +799,7 @@
"pclk_mac", "clk_mac_speed";
phy-mode = "rmii";
pinctrl-names = "default";
- pinctrl-0 = <&rmii_pins>;
+ pinctrl-0 = <&rmii_pins &mac_refclk_12ma>;
resets = <&cru SRST_GMAC_A>;
reset-names = "stmmaceth";
power-domains = <&power PX30_PD_GMAC>;
@@ -807,6 +814,7 @@
<&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
fifo-depth = <0x100>;
+ cd-gpios = <&gpio0 RK_PA3 GPIO_ACTIVE_HIGH>;
interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_det &sdmmc_bus4>;
@@ -2176,8 +2184,16 @@
/* mac_mdio */
<2 RK_PA7 RK_FUNC_2 &pcfg_pull_none>,
/* mac_mdc */
- <2 RK_PB1 RK_FUNC_2 &pcfg_pull_none>,
- /* mac_clk */
+ <2 RK_PB1 RK_FUNC_2 &pcfg_pull_none>;
+ };
+
+ mac_refclk_12ma: mac-refclk-12ma {
+ rockchip,pins =
+ <2 RK_PB2 RK_FUNC_2 &pcfg_pull_none_12ma>;
+ };
+
+ mac_refclk: mac-refclk {
+ rockchip,pins =
<2 RK_PB2 RK_FUNC_2 &pcfg_pull_none>;
};
};
diff --git a/arch/arm/dts/rk1808-evb.dts b/arch/arm/dts/rk1808-evb.dts
index 728ca1c73b..d857a0b5f2 100644
--- a/arch/arm/dts/rk1808-evb.dts
+++ b/arch/arm/dts/rk1808-evb.dts
@@ -7,6 +7,7 @@
/dts-v1/;
#include "rk1808.dtsi"
#include "rk1808-u-boot.dtsi"
+#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <linux/media-bus-format.h>
@@ -30,6 +31,13 @@
press-threshold-microvolt = <10000>;
};
};
+
+ vcc_phy: vcc-phy-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc_phy";
+ regulator-always-on;
+ regulator-boot-on;
+ };
};
&emmc {
@@ -44,6 +52,21 @@
status = "okay";
};
+&gmac {
+ phy-supply = <&vcc_phy>;
+ phy-mode = "rgmii";
+ clock_in_out = "input";
+ snps,reset-gpio = <&gpio0 10 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_GMAC>;
+ assigned-clock-parents = <&gmac_clkin>;
+ tx_delay = <0x50>;
+ rx_delay = <0x3a>;
+ status = "disabled";
+};
+
&uart2 {
clock-frequency = <24000000>;
status = "okay";
diff --git a/arch/arm/dts/rk1808.dtsi b/arch/arm/dts/rk1808.dtsi
index 13ff2b5516..47e1975660 100644
--- a/arch/arm/dts/rk1808.dtsi
+++ b/arch/arm/dts/rk1808.dtsi
@@ -1302,11 +1302,11 @@
rgmii_pins: rgmii-pins {
rockchip,pins =
/* rgmii_txen */
- <2 RK_PA1 2 &pcfg_pull_none_12ma>,
+ <2 RK_PA1 2 &pcfg_pull_none_4ma>,
/* rgmii_txd1 */
- <2 RK_PA2 2 &pcfg_pull_none_12ma>,
+ <2 RK_PA2 2 &pcfg_pull_none_4ma>,
/* rgmii_txd0 */
- <2 RK_PA3 2 &pcfg_pull_none_12ma>,
+ <2 RK_PA3 2 &pcfg_pull_none_4ma>,
/* rgmii_rxd0 */
<2 RK_PA4 2 &pcfg_pull_none>,
/* rgmii_rxd1 */
@@ -1314,13 +1314,13 @@
/* rgmii_rxdv */
<2 RK_PA7 2 &pcfg_pull_none>,
/* rgmii_mdio */
- <2 RK_PB0 2 &pcfg_pull_none>,
+ <2 RK_PB0 2 &pcfg_pull_none_2ma>,
/* rgmii_mdc */
- <2 RK_PB2 2 &pcfg_pull_none>,
+ <2 RK_PB2 2 &pcfg_pull_none_2ma>,
/* rgmii_txd3 */
- <2 RK_PB3 2 &pcfg_pull_none_12ma>,
+ <2 RK_PB3 2 &pcfg_pull_none_4ma>,
/* rgmii_txd2 */
- <2 RK_PB4 2 &pcfg_pull_none_12ma>,
+ <2 RK_PB4 2 &pcfg_pull_none_4ma>,
/* rgmii_rxd2 */
<2 RK_PB5 2 &pcfg_pull_none>,
/* rgmii_rxd3 */
@@ -1328,7 +1328,7 @@
/* rgmii_clk */
<2 RK_PB7 2 &pcfg_pull_none>,
/* rgmii_txclk */
- <2 RK_PC1 2 &pcfg_pull_none_12ma>,
+ <2 RK_PC1 2 &pcfg_pull_none_4ma>,
/* rgmii_rxclk */
<2 RK_PC2 2 &pcfg_pull_none>;
};
@@ -1336,11 +1336,11 @@
rmii_pins: rmii-pins {
rockchip,pins =
/* rmii_txen */
- <2 RK_PA1 2 &pcfg_pull_none_12ma>,
+ <2 RK_PA1 2 &pcfg_pull_none_4ma>,
/* rmii_txd1 */
- <2 RK_PA2 2 &pcfg_pull_none_12ma>,
+ <2 RK_PA2 2 &pcfg_pull_none_4ma>,
/* rmii_txd0 */
- <2 RK_PA3 2 &pcfg_pull_none_12ma>,
+ <2 RK_PA3 2 &pcfg_pull_none_4ma>,
/* rmii_rxd0 */
<2 RK_PA4 2 &pcfg_pull_none>,
/* rmii_rxd1 */
@@ -1350,9 +1350,9 @@
/* rmii_rxdv */
<2 RK_PA7 2 &pcfg_pull_none>,
/* rmii_mdio */
- <2 RK_PB0 2 &pcfg_pull_none>,
+ <2 RK_PB0 2 &pcfg_pull_none_2ma>,
/* rmii_mdc */
- <2 RK_PB2 2 &pcfg_pull_none>,
+ <2 RK_PB2 2 &pcfg_pull_none_2ma>,
/* rmii_clk */
<2 RK_PB7 2 &pcfg_pull_none>;
};
diff --git a/arch/arm/dts/rk3229-evb.dts b/arch/arm/dts/rk3229-evb.dts
index 376d1e7d22..5b4c97befc 100644
--- a/arch/arm/dts/rk3229-evb.dts
+++ b/arch/arm/dts/rk3229-evb.dts
@@ -34,6 +34,19 @@
regulator-always-on;
regulator-boot-on;
};
+
+ gpio-keys {
+ u-boot,dm-pre-reloc;
+ compatible = "gpio-keys";
+ status = "okay";
+
+ volume-up {
+ u-boot,dm-pre-reloc;
+ linux,code = <KEY_VOLUMEUP>;
+ label = "Volume Up";
+ gpios = <&gpio3 25 GPIO_ACTIVE_LOW>;
+ };
+ };
};
&dmc {
diff --git a/arch/arm/dts/rk322x-u-boot.dtsi b/arch/arm/dts/rk322x-u-boot.dtsi
index 432af90b7c..3d73382141 100644
--- a/arch/arm/dts/rk322x-u-boot.dtsi
+++ b/arch/arm/dts/rk322x-u-boot.dtsi
@@ -61,3 +61,17 @@
u-boot,dm-pre-reloc;
status = "okay";
};
+
+&pinctrl {
+ u-boot,dm-pre-reloc;
+ status = "okay";
+};
+
+&gpio1 {
+ u-boot,dm-pre-reloc;
+};
+
+&gpio3 {
+ u-boot,dm-pre-reloc;
+ status = "okay";
+};
diff --git a/arch/arm/dts/rk322x.dtsi b/arch/arm/dts/rk322x.dtsi
index d022b025f3..e9ee5a2933 100644
--- a/arch/arm/dts/rk322x.dtsi
+++ b/arch/arm/dts/rk322x.dtsi
@@ -459,6 +459,7 @@
<&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
fifo-depth = <0x100>;
+ cd-gpios = <&gpio1 RK_PC1 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_bus4>;
status = "disabled";
diff --git a/arch/arm/dts/rk3288-u-boot.dtsi b/arch/arm/dts/rk3288-u-boot.dtsi
index 42e2b025ea..e51e5e0373 100644
--- a/arch/arm/dts/rk3288-u-boot.dtsi
+++ b/arch/arm/dts/rk3288-u-boot.dtsi
@@ -65,6 +65,10 @@
u-boot,dm-pre-reloc;
};
+&gpio6 {
+ u-boot,dm-pre-reloc;
+};
+
&usbphy0 {
u-boot,dm-pre-reloc;
status = "okay";
diff --git a/arch/arm/dts/rk3288.dtsi b/arch/arm/dts/rk3288.dtsi
index 6e7418378e..10249bcbc9 100644
--- a/arch/arm/dts/rk3288.dtsi
+++ b/arch/arm/dts/rk3288.dtsi
@@ -211,6 +211,7 @@
<&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
fifo-depth = <0x100>;
+ cd-gpios = <&gpio6 RK_PC6 GPIO_ACTIVE_HIGH>;
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
reg = <0xff0c0000 0x4000>;
status = "disabled";
diff --git a/arch/arm/dts/rk3308-evb.dts b/arch/arm/dts/rk3308-evb.dts
index dfcd3f2916..7ddcae479f 100644
--- a/arch/arm/dts/rk3308-evb.dts
+++ b/arch/arm/dts/rk3308-evb.dts
@@ -269,6 +269,12 @@
status = "okay";
};
+ vcc_phy: vcc-phy-regulator {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc_phy";
+ regulator-always-on;
+ regulator-boot-on;
+ };
};
&display_subsystem {
@@ -283,6 +289,19 @@
status = "okay";
};
+&mac {
+ phy-supply = <&vcc_phy>;
+ assigned-clocks = <&cru SCLK_MAC>;
+ assigned-clock-parents = <&mac_clkin>;
+ clock_in_out = "input";
+ pinctrl-names = "default";
+ pinctrl-0 = <&rmii_pins &mac_refclk>;
+ snps,reset-gpio = <&gpio4 RK_PC0 GPIO_ACTIVE_LOW>;
+ snps,reset-active-low;
+ snps,reset-delays-us = <0 50000 50000>;
+ status = "disabled";
+};
+
&pwm0 {
status = "okay";
};
diff --git a/arch/arm/dts/rk3308.dtsi b/arch/arm/dts/rk3308.dtsi
index 1e9ec023e6..d51c69a49f 100644
--- a/arch/arm/dts/rk3308.dtsi
+++ b/arch/arm/dts/rk3308.dtsi
@@ -67,6 +67,13 @@
interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
};
+ mac_clkin: external-mac-clock {
+ compatible = "fixed-clock";
+ clock-frequency = <50000000>;
+ clock-output-names = "mac_clkin";
+ #clock-cells = <0>;
+ };
+
display_subsystem: display-subsystem {
compatible = "rockchip,display-subsystem";
ports = <&vop_out>;
@@ -446,6 +453,28 @@
status = "disabled";
};
+ mac: ethernet@ff4e0000 {
+ compatible = "rockchip,rk3308-mac";
+ reg = <0x0 0xff4e0000 0x0 0x10000>;
+ rockchip,grf = <&grf>;
+ interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "macirq";
+ clocks = <&cru SCLK_MAC>, <&cru SCLK_MAC_RX_TX>,
+ <&cru SCLK_MAC_RX_TX>, <&cru SCLK_MAC_REF>,
+ <&cru SCLK_MAC>, <&cru ACLK_MAC>,
+ <&cru PCLK_MAC>, <&cru SCLK_MAC_RMII>;
+ clock-names = "stmmaceth", "mac_clk_rx",
+ "mac_clk_tx", "clk_mac_ref",
+ "clk_mac_refout", "aclk_mac",
+ "pclk_mac", "clk_mac_speed";
+ phy-mode = "rmii";
+ pinctrl-names = "default";
+ pinctrl-0 = <&rmii_pins &mac_refclk_12ma>;
+ resets = <&cru SRST_MAC_A>;
+ reset-names = "stmmaceth";
+ status = "disabled";
+ };
+
cru: clock-controller@ff500000 {
compatible = "rockchip,rk3308-cru";
reg = <0x0 0xff500000 0x0 0x1000>;
@@ -1046,10 +1075,19 @@
/* mac_mdio */
<1 RK_PB6 3 &pcfg_pull_none>,
/* mac_mdc */
- <1 RK_PB5 3 &pcfg_pull_none>,
- /* mac_clk */
+ <1 RK_PB5 3 &pcfg_pull_none>;
+ };
+
+ mac_refclk_12ma: mac-refclk-12ma {
+ rockchip,pins =
+ <1 RK_PB4 3 &pcfg_pull_none_12ma>;
+ };
+
+ mac_refclk: mac-refclk {
+ rockchip,pins =
<1 RK_PB4 3 &pcfg_pull_none>;
};
+
};
lcdc {
diff --git a/arch/arm/dts/rk3328-u-boot.dtsi b/arch/arm/dts/rk3328-u-boot.dtsi
index 7a07362a95..dc5dc68bf5 100644
--- a/arch/arm/dts/rk3328-u-boot.dtsi
+++ b/arch/arm/dts/rk3328-u-boot.dtsi
@@ -11,6 +11,7 @@
};
chosen {
+ u-boot,spl-boot-order = &sdmmc, &emmc;
stdout-path = &uart2;
};
diff --git a/arch/arm/dts/rk3368-px5-evb-u-boot.dtsi b/arch/arm/dts/rk3368-px5-evb-u-boot.dtsi
index 3a5e30ea55..ce515853d0 100644
--- a/arch/arm/dts/rk3368-px5-evb-u-boot.dtsi
+++ b/arch/arm/dts/rk3368-px5-evb-u-boot.dtsi
@@ -3,6 +3,27 @@
*
* SPDX-License-Identifier: GPL-2.0+ X11
*/
+/ {
+ chosen {
+ u-boot,spl-boot-order = &emmc;
+ };
+};
+
+&dmc {
+ u-boot,dm-pre-reloc;
+
+ /*
+ * PX5-evb(2GB) need to use CBRD mode, or else the dram is not correct
+ * See doc/device-tree-bindings/clock/rockchip,rk3368-dmc.txt for
+ * details on the 'rockchip,memory-schedule' property and how it
+ * affects the physical-address to device-address mapping.
+ */
+ rockchip,memory-schedule = <DMC_MSCH_CBRD>;
+ rockchip,ddr-frequency = <800000000>;
+ rockchip,ddr-speed-bin = <DDR3_1600K>;
+
+ status = "okay";
+};
&pinctrl {
u-boot,dm-pre-reloc;
@@ -21,6 +42,10 @@
u-boot,dm-pre-reloc;
};
+&sgrf {
+ u-boot,dm-pre-reloc;
+};
+
&cru {
u-boot,dm-pre-reloc;
};
@@ -32,3 +57,7 @@
&uart4 {
u-boot,dm-pre-reloc;
};
+
+&emmc {
+ u-boot,dm-pre-reloc;
+};
diff --git a/arch/arm/dts/rk3399-evb.dts b/arch/arm/dts/rk3399-evb.dts
index bbc1c0f4a1..e8e240898c 100644
--- a/arch/arm/dts/rk3399-evb.dts
+++ b/arch/arm/dts/rk3399-evb.dts
@@ -25,7 +25,7 @@
status = "okay";
io-channels = <&saradc 1>;
- vol-up-key {
+ vol-up-key0 {
u-boot,dm-pre-reloc;
linux,code = <KEY_VOLUMEUP>;
label = "volume up";
@@ -40,7 +40,7 @@
status = "okay";
io-channels = <&saradc 2>;
- vol-up-key {
+ vol-up-key1 {
u-boot,dm-pre-reloc;
linux,code = <KEY_VOLUMEUP>;
label = "volume up";
diff --git a/arch/arm/dts/rk3399pro-npu-evb.dts b/arch/arm/dts/rk3399pro-npu-evb.dts
index 752ed00a85..00e521c36b 100644
--- a/arch/arm/dts/rk3399pro-npu-evb.dts
+++ b/arch/arm/dts/rk3399pro-npu-evb.dts
@@ -17,9 +17,9 @@
stdout-path = &uart2;
};
- ramdisk-readonly {
+ ramdisk-ro {
u-boot,dm-pre-reloc;
- compatible = "ramdisk-readonly";
+ compatible = "ramdisk-ro";
status = "okay";
};
};
diff --git a/arch/arm/dts/rv1108-evb.dts b/arch/arm/dts/rv1108-evb.dts
index d63e0cf1df..db5aebb6d5 100644
--- a/arch/arm/dts/rv1108-evb.dts
+++ b/arch/arm/dts/rv1108-evb.dts
@@ -7,6 +7,7 @@
/dts-v1/;
#include "rv1108.dtsi"
+#include "rv1108-u-boot.dtsi"
#include "rv1108-sdram-ddr3-400.dtsi"
#include <dt-bindings/input/input.h>
@@ -182,7 +183,6 @@
};
&emmc {
- u-boot,dm-pre-reloc;
bus-width = <8>;
cap-mmc-highspeed;
supports-emmc;
diff --git a/arch/arm/dts/rv1108-u-boot.dtsi b/arch/arm/dts/rv1108-u-boot.dtsi
new file mode 100644
index 0000000000..f065afd9d0
--- /dev/null
+++ b/arch/arm/dts/rv1108-u-boot.dtsi
@@ -0,0 +1,27 @@
+/*
+ * (C) Copyright 2019 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+&emmc {
+ u-boot,dm-pre-reloc;
+};
+
+&dmc {
+ u-boot,dm-pre-reloc;
+};
+
+&grf {
+ u-boot,dm-pre-reloc;
+};
+
+&uart2 {
+ u-boot,dm-pre-reloc;
+};
+&uart1 {
+ u-boot,dm-pre-reloc;
+};
+&uart0 {
+ u-boot,dm-pre-reloc;
+};
diff --git a/arch/arm/dts/rv1108.dtsi b/arch/arm/dts/rv1108.dtsi
index 349e72a987..5354ac3b1e 100644
--- a/arch/arm/dts/rv1108.dtsi
+++ b/arch/arm/dts/rv1108.dtsi
@@ -682,7 +682,6 @@
};
dmc: dmc@202b0000 {
- u-boot,dm-pre-reloc;
compatible = "rockchip,rv1108-dmc";
reg = <0x202b0000 0x400
0x20210000 0x400
diff --git a/arch/arm/include/asm/arch-rockchip/cru_rk1808.h b/arch/arm/include/asm/arch-rockchip/cru_rk1808.h
index ad97d41332..c6515a391c 100644
--- a/arch/arm/include/asm/arch-rockchip/cru_rk1808.h
+++ b/arch/arm/include/asm/arch-rockchip/cru_rk1808.h
@@ -181,6 +181,19 @@ enum {
EMMC_DIV50_SHIFT = 0,
EMMC_DIV50_MASK = 0xff << EMMC_DIV_SHIFT,
+ /* CRU_CLKSEL26_CON */
+ GMAC_PLL_SEL_SHIFT = 14,
+ GMAC_PLL_SEL_MASK = 3 << GMAC_PLL_SEL_SHIFT,
+ GMAC_PLL_SEL_CPLL = 0,
+ GMAC_PLL_SEL_NPLL,
+ GMAC_PLL_SEL_PPLL,
+ CLK_GMAC_DIV_SHIFT = 8,
+ CLK_GMAC_DIV_MASK = 0x1f << CLK_GMAC_DIV_SHIFT,
+ SFC_PLL_SEL_SHIFT = 7,
+ SFC_PLL_SEL_MASK = 1 << SFC_PLL_SEL_SHIFT,
+ SFC_DIV_CON_SHIFT = 0,
+ SFC_DIV_CON_MASK = 0x7f,
+
/* CRU_CLK_SEL27_CON */
CLK_BUS_PLL_SEL_GPLL = 0,
CLK_BUS_PLL_SEL_CPLL = 1,
@@ -188,6 +201,17 @@ enum {
CLK_BUS_PLL_SEL_MASK = 1 << CLK_BUS_PLL_SEL_SHIFT,
HSCLK_BUS_DIV_CON_SHIFT = 8,
HSCLK_BUS_DIV_CON_MASK = 0x1f << HSCLK_BUS_DIV_CON_SHIFT,
+ RGMII_CLK_SEL_SHIFT = 2,
+ RGMII_CLK_SEL_MASK = 3 << RGMII_CLK_SEL_SHIFT,
+ RGMII_CLK_SEL_125M = 0,
+ RGMII_CLK_SEL_2M = 2,
+ RGMIIC_CLK_SEL_25M = 3,
+ RMII_CLK_SEL_SHIFT = 1,
+ RMII_CLK_SEL_MASK = 1 << RMII_CLK_SEL_SHIFT,
+ RMII_EXTCLK_SEL_SHIFT = 0,
+ RMII_EXTCLK_SEL_MASK = 1 << RMII_EXTCLK_SEL_SHIFT,
+ RMII_EXTCLK_SEL_INT = 0,
+ RMII_EXTCLK_SEL_EXT,
/* CRU_CLK_SEL28_CON */
MSCLK_BUS_DIV_CON_SHIFT = 8,
diff --git a/arch/arm/include/asm/arch-rockchip/cru_rk3308.h b/arch/arm/include/asm/arch-rockchip/cru_rk3308.h
index 0f0b5e43bb..8ebd6e1903 100644
--- a/arch/arm/include/asm/arch-rockchip/cru_rk3308.h
+++ b/arch/arm/include/asm/arch-rockchip/cru_rk3308.h
@@ -261,6 +261,23 @@ enum {
EMMC_DIV_SHIFT = 0,
EMMC_DIV_MASK = 0xff << EMMC_DIV_SHIFT,
+ /* CRU_CLKSEL43_CON */
+ MAC_CLK_SPEED_SEL_SHIFT = 15,
+ MAC_CLK_SPEED_SEL_MASK = 1 << MAC_CLK_SPEED_SEL_SHIFT,
+ MAC_CLK_SPEED_SEL_10M = 0,
+ MAC_CLK_SPEED_SEL_100M,
+ MAC_CLK_SOURCE_SEL_SHIFT = 14,
+ MAC_CLK_SOURCE_SEL_MASK = 1 << MAC_CLK_SOURCE_SEL_SHIFT,
+ MAC_CLK_SOURCE_SEL_INTERNAL = 0,
+ MAC_CLK_SOURCE_SEL_EXTERNAL,
+ MAC_PLL_SHIFT = 6,
+ MAC_PLL_MASK = 0x3 << MAC_PLL_SHIFT,
+ MAC_SEL_DPLL = 0,
+ MAC_SEL_VPLL0,
+ MAC_SEL_VPLL1,
+ MAC_DIV_SHIFT = 0,
+ MAC_DIV_MASK = 0x1f << MAC_DIV_SHIFT,
+
/* CRU_CLK_SEL45_CON */
AUDIO_PCLK_DIV_SHIFT = 8,
AUDIO_PCLK_DIV_MASK = 0x1f << AUDIO_PCLK_DIV_SHIFT,
diff --git a/arch/arm/include/asm/arch-rockchip/cru_rk3368.h b/arch/arm/include/asm/arch-rockchip/cru_rk3368.h
index a965129703..db2d777bde 100644
--- a/arch/arm/include/asm/arch-rockchip/cru_rk3368.h
+++ b/arch/arm/include/asm/arch-rockchip/cru_rk3368.h
@@ -130,6 +130,10 @@ enum {
ACLK_PERI_DIV_CON_SHIFT = 0,
ACLK_PERI_DIV_CON_MASK = 0x1f,
+ /* CLKSEL10CON */
+ PCLK_ALIVE_DIV_CON_SHIFT = 8,
+ PCLK_ALIVE_DIV_CON_MASK = 0x1f << PCLK_ALIVE_DIV_CON_SHIFT,
+
/* CLKSEL12_CON */
MCU_STCLK_DIV_SHIFT = 8,
MCU_STCLK_DIV_MASK = GENMASK(10, 8),
diff --git a/arch/arm/include/asm/arch-rockchip/param.h b/arch/arm/include/asm/arch-rockchip/param.h
index 66ba2ac22e..dbfb1fb27f 100644
--- a/arch/arm/include/asm/arch-rockchip/param.h
+++ b/arch/arm/include/asm/arch-rockchip/param.h
@@ -7,28 +7,36 @@
#ifndef __ROCKCHIP_PARAM_H_
#define __ROCKCHIP_PARAM_H_
-#include <sysmem.h>
+#include <memblk.h>
+
+/**
+ * param_parse_ddr_mem() - Parse ddr memory region
+ *
+ * @out_count: valid count of memblock for memblock list.
+ * @return memblock structure list which contains base and size info.
+ */
+struct memblock *param_parse_ddr_mem(int *out_count);
/**
* param_parse_atf_mem() - Parse atf memory region
*
- * @return sysmem_property structure which contains base and size info.
+ * @return memblock structure which contains base and size info.
*/
-struct sysmem_property param_parse_atf_mem(void);
+struct memblock param_parse_atf_mem(void);
/**
* param_parse_atf_mem() - Parse op-tee memory region
*
- * @return sysmem_property structure which contains base and size info.
+ * @return memblock structure which contains base and size info.
*/
-struct sysmem_property param_parse_optee_mem(void);
+struct memblock param_parse_optee_mem(void);
/**
* param_parse_atf_mem() - Parse platform common reserved memory region
*
- * @return sysmem_property structure which contains base and size info.
+ * @return memblock structure which contains base and size info.
*/
-struct sysmem_property param_parse_common_resv_mem(void);
+struct memblock param_parse_common_resv_mem(void);
/**
* param_parse_bootdev() - Parse boot device info.
diff --git a/arch/arm/include/asm/arch-rockchip/rk_atags.h b/arch/arm/include/asm/arch-rockchip/rk_atags.h
index 78c0039b1e..b9028b35d2 100644
--- a/arch/arm/include/asm/arch-rockchip/rk_atags.h
+++ b/arch/arm/include/asm/arch-rockchip/rk_atags.h
@@ -17,6 +17,8 @@
#define ATAG_TOS_MEM 0x54410053
#define ATAG_RAM_PARTITION 0x54410054
#define ATAG_ATF_MEM 0x54410055
+#define ATAG_PUB_KEY 0x54410056
+#define ATAG_SOC_INFO 0x54410057
#define ATAG_MAX 0x544100ff
/* Tag size and offset */
@@ -44,6 +46,11 @@
#define SERIAL_M_MODE_M1 0x1
#define SERIAL_M_MODE_M2 0x2
+/* tag_soc_info.flags */
+#define SOC_FLAGS_ET00 0x45543030
+#define SOC_FLAGS_ET01 0x45543031
+#define SOC_FLAGS_ET02 0x45543032
+
struct tag_serial {
u32 version;
u32 enable;
@@ -51,7 +58,8 @@ struct tag_serial {
u32 baudrate;
u32 m_mode;
u32 id;
- u32 reserved[3];
+ u32 reserved[2];
+ u32 hash;
} __packed;
struct tag_bootdev {
@@ -59,14 +67,16 @@ struct tag_bootdev {
u32 devtype;
u32 devnum;
u32 mode;
- u32 reserved[8];
+ u32 reserved[7];
+ u32 hash;
} __packed;
struct tag_ddr_mem {
u32 count;
u32 version;
u64 bank[20];
- u32 reserved[4];
+ u32 reserved[3];
+ u32 hash;
} __packed;
struct tag_tos_mem {
@@ -85,7 +95,9 @@ struct tag_tos_mem {
u32 flags;
} drm_mem;
- u64 reserved[8];
+ u64 reserved[7];
+ u32 reserved1;
+ u32 hash;
} __packed;
struct tag_atf_mem {
@@ -93,7 +105,16 @@ struct tag_atf_mem {
u64 phy_addr;
u32 size;
u32 flags;
- u32 reserved[3];
+ u32 reserved[2];
+ u32 hash;
+} __packed;
+
+struct tag_pub_key {
+ u32 version;
+ u32 len;
+ u8 data[768];
+ u32 reserved[6];
+ u32 hash;
} __packed;
struct tag_ram_partition {
@@ -105,7 +126,18 @@ struct tag_ram_partition {
char name[16];
u64 start;
u64 size;
- } part[16];
+ } part[6];
+
+ u32 reserved1[3];
+ u32 hash;
+} __packed;
+
+struct tag_soc_info {
+ u32 version;
+ u32 name; /* Hex: 0x3288, 0x3399... */
+ u32 flags;
+ u32 reserved[6];
+ u32 hash;
} __packed;
struct tag_core {
@@ -130,6 +162,8 @@ struct tag {
struct tag_tos_mem tos_mem;
struct tag_ram_partition ram_part;
struct tag_atf_mem atf_mem;
+ struct tag_pub_key pub_key;
+ struct tag_soc_info soc;
} u;
} __aligned(4);
diff --git a/arch/arm/lib/crt0_64.S b/arch/arm/lib/crt0_64.S
index d34e49cc8a..fad7f518c6 100644
--- a/arch/arm/lib/crt0_64.S
+++ b/arch/arm/lib/crt0_64.S
@@ -65,8 +65,26 @@
*/
ENTRY(_main)
+#if defined(CONFIG_SPL_BUILD) && defined(DEBUG)
+ .equ SCTLR_A_BIT, (1 << 1)
+ .equ SCTLR_SA_BIT, (1 << 3)
+ .equ SCTLR_I_BIT, (1 << 12)
/*
+ * Enable the instruction cache, stack pointer
+ * and data access alignment checks
+ */
+ mov x1, #(SCTLR_I_BIT | SCTLR_A_BIT | SCTLR_SA_BIT)
+ mrs x0, sctlr_el3
+ orr x0, x0, x1
+ msr sctlr_el3, x0
+ isb
+/*
+ * Enable External Abort and SError
+ */
+ msr daifclr, #4
+#endif
+/*
* Set up initial C runtime environment and call board_init_f(0).
*/
#if defined(CONFIG_TPL_BUILD) && defined(CONFIG_TPL_NEEDS_SEPARATE_STACK)
diff --git a/arch/arm/lib/stacktrace.c b/arch/arm/lib/stacktrace.c
index 266aeb2265..1520098219 100644
--- a/arch/arm/lib/stacktrace.c
+++ b/arch/arm/lib/stacktrace.c
@@ -503,7 +503,9 @@ void print_stack_arm32(struct unwind_state_arm32 *state,
} while (unwind_stack_arm32(state, exidx, exidx_sz,
kernel_stack, stack, stack_size));
- printf("\nNOTE: Please use ./scripts/stacktrace.sh to parse trace info\n");
+ printf("\nCopy above stack info to a file(eg. dump.txt), and\n"
+ "execute command in your U-Boot project: "
+ "./scripts/stacktrace.sh dump.txt\n\n");
}
void dump_core_stack(struct pt_regs *regs)
diff --git a/arch/arm/lib/stacktrace_64.c b/arch/arm/lib/stacktrace_64.c
index 2494684a84..5637926175 100644
--- a/arch/arm/lib/stacktrace_64.c
+++ b/arch/arm/lib/stacktrace_64.c
@@ -90,7 +90,9 @@ void dump_core_stack(struct pt_regs *regs)
printf(" [< %08lx >]\n", pc);
} while (walk_stackframe(&frame));
- printf("\nNOTE: Please use ./scripts/stacktrace.sh to parse trace info\n");
+ printf("\nCopy above stack info to a file(eg. dump.txt), and\n"
+ "execute command in your U-Boot project: "
+ "./scripts/stacktrace.sh dump.txt\n\n");
}
void dump_stack(void)
diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
index 11402c8b42..040a117dec 100644
--- a/arch/arm/mach-rockchip/Kconfig
+++ b/arch/arm/mach-rockchip/Kconfig
@@ -283,6 +283,12 @@ config ROCKCHIP_RK3368
if ROCKCHIP_RK3368
+config ROCKCHIP_PX5
+ bool "Support Rockchip PX5"
+ help
+ PX5 is a variant of RK3368, it shares codes with RK3368, but we still
+ need this macro to distinguish PX5 and RK3368.
+
config TPL_LDSCRIPT
default "arch/arm/mach-rockchip/rk3368/u-boot-tpl.lds"
@@ -537,6 +543,14 @@ config RKIMG_BOOTLOADER
with dtb and uboot/kernel logo bmp, vendor storage for custom info
like SN and MAC address.
+config RKIMG_ANDROID_BOOTMODE_LEGACY
+ bool "Support set androidboot.mode with legacy rule"
+ depends on RKIMG_BOOTLOADER
+ default n
+ help
+ Rockchip set "androidboot.mode=" as "charger" or boot media for android,
+ which is a rockchip private solution(SDK < 8.1) and deprecated.
+
config ROCKCHIP_RESOURCE_IMAGE
bool "Enable support for rockchip resource image"
depends on RKIMG_BOOTLOADER
@@ -545,6 +559,22 @@ config ROCKCHIP_RESOURCE_IMAGE
This enables support to get dtb or logo files from
rockchip resource image format partition.
+config ROCKCHIP_EARLY_DISTRO_DTB
+ bool "Enable support for distro dtb early"
+ depends on DISTRO_DEFAULTS && USING_KERNEL_DTB
+ default n
+ help
+ This enables loading dtb from distro bootable partition when there
+ is no valid dtb in android boot.img and rockchip resource.img.
+
+if ROCKCHIP_EARLY_DISTRO_DTB
+
+config ROCKCHIP_EARLY_DISTRO_DTB_PATH
+ string "/rk-kernel.dtb"
+ help
+ "DTB file path in the bootable partition image"
+endif
+
config ROCKCHIP_VENDOR_PARTITION
bool "Rockchip vendor storage partition support"
depends on RKIMG_BOOTLOADER
diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile
index 33618ae6ca..00132884a3 100644
--- a/arch/arm/mach-rockchip/Makefile
+++ b/arch/arm/mach-rockchip/Makefile
@@ -24,6 +24,7 @@ obj-y += boot_mode.o
obj-y += board.o
obj-y += chip_info.o
obj-y += iomem.o
+obj-y += memblk.o
obj-$(CONFIG_ROCKCHIP_CRC) += rockchip_crc.o
obj-$(CONFIG_ROCKCHIP_SMCCC) += rockchip_smccc.o
diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c
index 2244eaffef..16136442df 100644
--- a/arch/arm/mach-rockchip/board.c
+++ b/arch/arm/mach-rockchip/board.c
@@ -5,8 +5,10 @@
*/
#include <common.h>
#include <clk.h>
+#include <bidram.h>
#include <dm.h>
#include <debug_uart.h>
+#include <memblk.h>
#include <ram.h>
#include <syscon.h>
#include <sysmem.h>
@@ -282,27 +284,142 @@ int interrupt_debugger_init(void)
return ret;
}
+#if defined(CONFIG_ROCKCHIP_RK1808) && !defined(CONFIG_COPROCESSOR_RK1808)
+#define PINCTRL_EMMC_BUS8_PATH "/pinctrl/emmc/emmc-bus8"
+#define PINCTRL_EMMC_CMD_PATH "/pinctrl/emmc/emmc-cmd"
+#define PINCTRL_EMMC_CLK_PATH "/pinctrl/emmc/emmc-clk"
+#define PINCTRL_PCFG_PU_2MA_PATH "/pinctrl/pcfg-pull-up-2ma"
+#define MAX_ROCKCHIP_PINS_ENTRIES 12
+
+static int rockchip_pinctrl_cfg_fdt_fixup(const char *path, u32 new_phandle)
+{
+ u32 cells[MAX_ROCKCHIP_PINS_ENTRIES * 4];
+ const u32 *data;
+ int i, count;
+ int node;
+
+ node = fdt_path_offset(gd->fdt_blob, path);
+ if (node < 0) {
+ debug("%s: can't find: %s\n", __func__, path);
+ return node;
+ }
+
+ data = fdt_getprop(gd->fdt_blob, node, "rockchip,pins", &count);
+ if (!data) {
+ debug("%s: can't find prop \"rockchip,pins\"\n", __func__);
+ return -ENODATA;
+ }
+
+ count /= sizeof(u32);
+ if (count > MAX_ROCKCHIP_PINS_ENTRIES * 4) {
+ debug("%s: %d is over max count\n", __func__, count);
+ return -EINVAL;
+ }
+
+ for (i = 0; i < count; i++)
+ cells[i] = data[i];
+
+ for (i = 0; i < (count >> 2); i++)
+ cells[4 * i + 3] = cpu_to_fdt32(new_phandle);
+
+ fdt_setprop((void *)gd->fdt_blob, node, "rockchip,pins",
+ &cells, count * sizeof(u32));
+
+ return 0;
+}
+#endif
+
int board_fdt_fixup(void *blob)
{
- __maybe_unused int ret = 0;
+ int ret = 0;
+ /*
+ * Common fixup for DRM
+ */
#ifdef CONFIG_DRM_ROCKCHIP
rockchip_display_fixup(blob);
#endif
+ /*
+ * Platform fixup:
+ *
+ * - RK3288: Recognize RK3288W by HDMI Revision ID is 0x1A;
+ * - RK1808: MMC strength 2mA;
+ */
#ifdef CONFIG_ROCKCHIP_RK3288
- /* RK3288W HDMI Revision ID is 0x1A */
if (readl(0xff980004) == 0x1A) {
ret = fdt_setprop_string(blob, 0,
"compatible", "rockchip,rk3288w");
if (ret)
printf("fdt set compatible failed: %d\n", ret);
}
+#elif defined(CONFIG_ROCKCHIP_RK1808) && !defined(CONFIG_COPROCESSOR_RK1808)
+ struct tag *t;
+ u32 ph_pu_2ma;
+
+ t = atags_get_tag(ATAG_SOC_INFO);
+ if (!t)
+ return 0;
+
+ debug("soc=0x%x, flags=0x%x\n", t->u.soc.name, t->u.soc.flags);
+
+ if (t->u.soc.flags != SOC_FLAGS_ET00)
+ return 0;
+
+ ph_pu_2ma = fdt_get_phandle(gd->fdt_blob,
+ fdt_path_offset(gd->fdt_blob, PINCTRL_PCFG_PU_2MA_PATH));
+ if (!ph_pu_2ma) {
+ debug("Can't find: %s\n", PINCTRL_PCFG_PU_2MA_PATH);
+ return -EINVAL;
+ }
+
+ ret |= rockchip_pinctrl_cfg_fdt_fixup(PINCTRL_EMMC_BUS8_PATH, ph_pu_2ma);
+ ret |= rockchip_pinctrl_cfg_fdt_fixup(PINCTRL_EMMC_CMD_PATH, ph_pu_2ma);
+ ret |= rockchip_pinctrl_cfg_fdt_fixup(PINCTRL_EMMC_CLK_PATH, ph_pu_2ma);
#endif
return ret;
}
+#ifdef CONFIG_ARM64_BOOT_AARCH32
+/*
+ * Fixup MMU region attr for OP-TEE on ARMv8 CPU:
+ *
+ * What ever U-Boot is 64-bit or 32-bit mode, the OP-TEE is always 64-bit mode.
+ *
+ * Command for OP-TEE:
+ * 64-bit mode: dcache is always enabled;
+ * 32-bit mode: dcache is always disabled(Due to some unknown issue);
+ *
+ * Command for U-Boot:
+ * 64-bit mode: MMU table is static defined in rkxxx.c file, all memory
+ * regions are mapped. That's good to match OP-TEE MMU policy.
+ *
+ * 32-bit mode: MMU table is setup according to gd->bd->bi_dram[..] where
+ * the OP-TEE region has been reserved, so it can not be
+ * mapped(i.e. dcache is disabled). That's also good to match
+ * OP-TEE MMU policy.
+ *
+ * For the data coherence when communication between U-Boot and OP-TEE, U-Boot
+ * should follow OP-TEE MMU policy.
+ *
+ * Here is the special:
+ * When CONFIG_ARM64_BOOT_AARCH32 is enabled, U-Boot is 32-bit mode while
+ * OP-TEE is still 64-bit mode. U-Boot would not map MMU table for OP-TEE
+ * region(but OP-TEE requires it cacheable) so we fixup here.
+ */
+int board_initr_caches_fixup(void)
+{
+ struct memblock mem;
+
+ mem = param_parse_optee_mem();
+ if (mem.size)
+ mmu_set_region_dcache_behaviour(mem.base, mem.size,
+ DCACHE_WRITEBACK);
+ return 0;
+}
+#endif
+
void board_quiesce_devices(void)
{
#ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS
@@ -366,32 +483,37 @@ void board_lmb_reserve(struct lmb *lmb)
}
#endif
-#ifdef CONFIG_SYSMEM
-int board_sysmem_reserve(struct sysmem *sysmem)
+#ifdef CONFIG_BIDRAM
+int board_bidram_reserve(struct bidram *bidram)
{
- struct sysmem_property prop;
+ struct memblock mem;
int ret;
/* ATF */
- prop = param_parse_atf_mem();
- ret = sysmem_reserve(prop.name, prop.base, prop.size);
+ mem = param_parse_atf_mem();
+ ret = bidram_reserve(MEMBLK_ID_ATF, mem.base, mem.size);
if (ret)
return ret;
/* PSTORE/ATAGS/SHM */
- prop = param_parse_common_resv_mem();
- ret = sysmem_reserve(prop.name, prop.base, prop.size);
+ mem = param_parse_common_resv_mem();
+ ret = bidram_reserve(MEMBLK_ID_SHM, mem.base, mem.size);
if (ret)
return ret;
/* OP-TEE */
- prop = param_parse_optee_mem();
- ret = sysmem_reserve(prop.name, prop.base, prop.size);
+ mem = param_parse_optee_mem();
+ ret = bidram_reserve(MEMBLK_ID_OPTEE, mem.base, mem.size);
if (ret)
return ret;
return 0;
}
+
+parse_fn_t board_bidram_parse_fn(void)
+{
+ return param_parse_ddr_mem;
+}
#endif
#if defined(CONFIG_ROCKCHIP_PRELOADER_SERIAL) && \
diff --git a/arch/arm/mach-rockchip/boot_mode.c b/arch/arm/mach-rockchip/boot_mode.c
index a738bfd79c..f271c5b945 100644
--- a/arch/arm/mach-rockchip/boot_mode.c
+++ b/arch/arm/mach-rockchip/boot_mode.c
@@ -164,6 +164,8 @@ void rockchip_dnl_mode_check(void)
printf("recovery key pressed, entering recovery mode!\n");
env_set("reboot_mode", "recovery");
}
+ } else if (gd->console_evt == CONSOLE_EVT_CTRL_F) {
+ env_set("reboot_mode", "fastboot");
}
}
diff --git a/arch/arm/mach-rockchip/memblk.c b/arch/arm/mach-rockchip/memblk.c
new file mode 100644
index 0000000000..7d288ab080
--- /dev/null
+++ b/arch/arm/mach-rockchip/memblk.c
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <memblk.h>
+
+const static struct memblk_attr plat_mem_attr[MEMBLK_ID_MAX] = {
+ [MEMBLK_ID_DEMO] = {
+ .name = "DEMO",
+ .flags = M_ATTR_NONE,
+ },
+ [MEMBLK_ID_ATF] = {
+ .name = "ATF",
+ .flags = M_ATTR_NONE,
+ },
+ [MEMBLK_ID_OPTEE] = {
+ .name = "OP-TEE",
+ .flags = M_ATTR_NONE,
+ },
+ [MEMBLK_ID_SHM] = {
+ .name = "SHM",
+ .flags = M_ATTR_NONE,
+ },
+ [MEMBLK_ID_UBOOT] = {
+ .name = "U-Boot",
+ .flags = M_ATTR_OVERLAP,
+ },
+ [MEMBLK_ID_FASTBOOT] = {
+ .name = "FASTBOOT",
+ .flags = M_ATTR_OVERLAP,
+ },
+ [MEMBLK_ID_STACK] = {
+ .name = "STACK",
+ .flags = M_ATTR_HOFC | M_ATTR_OVERLAP,
+ },
+ [MEMBLK_ID_FDT] = {
+ .name = "FDT",
+ .flags = M_ATTR_OFC,
+ },
+ [MEMBLK_ID_FDT_DTBO] = {
+ .name = "FDT_DTBO",
+ .flags = M_ATTR_OFC,
+ },
+ [MEMBLK_ID_FDT_AOSP] = {
+ .name = "FDT_AOSP",
+ .flags = M_ATTR_OFC,
+ },
+ [MEMBLK_ID_RAMDISK] = {
+ .name = "RAMDISK",
+ .alias[0] = "BOOT",
+ .alias[1] = "RECOVERY",
+ .flags = M_ATTR_OFC,
+ },
+ [MEMBLK_ID_KERNEL] = {
+ .name = "KERNEL",
+ .flags = M_ATTR_OFC,
+ },
+ [MEMBLK_ID_ANDROID] = {
+ .name = "ANDROID",
+ .flags = M_ATTR_OFC,
+ },
+};
+
+const struct memblk_attr *mem_attr = plat_mem_attr;
diff --git a/arch/arm/mach-rockchip/param.c b/arch/arm/mach-rockchip/param.c
index c5c28d4955..6cf867686e 100644
--- a/arch/arm/mach-rockchip/param.c
+++ b/arch/arm/mach-rockchip/param.c
@@ -4,12 +4,15 @@
*/
#include <common.h>
+#include <dm.h>
+#include <ram.h>
#include <asm/io.h>
#include <asm/arch/rk_atags.h>
#include <asm/arch/param.h>
DECLARE_GLOBAL_DATA_PTR;
+#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
#define SDRAM_OFFSET(offset) (CONFIG_SYS_SDRAM_BASE + (offset))
#define PARAM_DRAM_INFO_OFFSET (SZ_32M)
#define PARAM_OPTEE_INFO_OFFSET (SZ_32M + SZ_2M)
@@ -47,13 +50,12 @@ static uint16_t trust_checksum(const uint8_t *buf, uint16_t len)
return checksum;
}
-struct sysmem_property param_parse_atf_mem(void)
+struct memblock param_parse_atf_mem(void)
{
- struct sysmem_property prop;
+ struct memblock mem;
- prop.name = "ATF";
- prop.base = 0;
- prop.size = 0;
+ mem.base = 0;
+ mem.size = 0;
#ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS
struct tag *t = NULL;
@@ -66,41 +68,40 @@ struct sysmem_property param_parse_atf_mem(void)
*/
t = atags_get_tag(ATAG_ATF_MEM);
if (t && t->u.atf_mem.size) {
- prop.base = t->u.atf_mem.phy_addr;
- prop.size = t->u.atf_mem.size;
+ mem.base = t->u.atf_mem.phy_addr;
+ mem.size = t->u.atf_mem.size;
/* Sanity */
- if (prop.base + prop.size > SDRAM_OFFSET(SZ_1M)) {
+ if (mem.base + mem.size > SDRAM_OFFSET(SZ_1M)) {
printf("%s: ATF reserved region is not within 0-1MB "
"offset(0x%08llx-0x%08llx)!\n",
- __func__, (u64)prop.base, (u64)prop.base + prop.size);
- return prop;
+ __func__, (u64)mem.base, (u64)mem.base + mem.size);
+ return mem;
}
}
#endif
/* Legacy */
- if (!prop.size) {
+ if (!mem.size) {
if (IS_ENABLED(CONFIG_ARM64) ||
IS_ENABLED(CONFIG_ARM64_BOOT_AARCH32)) {
- prop.base = SDRAM_OFFSET(0);
- prop.size = SZ_1M;
+ mem.base = SDRAM_OFFSET(0);
+ mem.size = SZ_1M;
}
}
- debug("ATF: 0x%llx - 0x%llx\n", (u64)prop.base, (u64)prop.base + prop.size);
+ debug("ATF: 0x%llx - 0x%llx\n", (u64)mem.base, (u64)mem.base + mem.size);
- return prop;
+ return mem;
}
-struct sysmem_property param_parse_optee_mem(void)
+struct memblock param_parse_optee_mem(void)
{
struct tos_param_t *tos_parameter;
- struct sysmem_property prop;
+ struct memblock mem;
u32 checksum;
- prop.name = "OP-TEE";
- prop.base = 0;
- prop.size = 0;
+ mem.base = 0;
+ mem.size = 0;
#ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS
struct tag *t = NULL;
@@ -113,13 +114,13 @@ struct sysmem_property param_parse_optee_mem(void)
*/
t = atags_get_tag(ATAG_TOS_MEM);
if (t && (t->u.tos_mem.tee_mem.flags == 1)) {
- prop.base = t->u.tos_mem.tee_mem.phy_addr;
- prop.size = t->u.tos_mem.tee_mem.size;
+ mem.base = t->u.tos_mem.tee_mem.phy_addr;
+ mem.size = t->u.tos_mem.tee_mem.size;
}
#endif
/* Legacy */
- if (!prop.size) {
+ if (!mem.size) {
tos_parameter =
(struct tos_param_t *)(SDRAM_OFFSET(PARAM_OPTEE_INFO_OFFSET));
checksum =
@@ -127,28 +128,30 @@ struct sysmem_property param_parse_optee_mem(void)
sizeof(struct tos_param_t) - 8);
if ((checksum == tos_parameter->checksum) &&
(tos_parameter->tee_mem.flags == 1)) {
- prop.base = tos_parameter->tee_mem.phy_addr;
- prop.size = tos_parameter->tee_mem.size;
+ mem.base = tos_parameter->tee_mem.phy_addr;
+ mem.size = tos_parameter->tee_mem.size;
}
}
- if (prop.size)
+ if (mem.size)
gd->flags |= GD_FLG_BL32_ENABLED;
- debug("TOS: 0x%llx - 0x%llx\n", (u64)prop.base, (u64)prop.base + prop.size);
+ debug("TOS: 0x%llx - 0x%llx\n", (u64)mem.base, (u64)mem.base + mem.size);
- return prop;
+ return mem;
}
-struct sysmem_property param_parse_common_resv_mem(void)
+struct memblock param_parse_common_resv_mem(void)
{
- struct sysmem_property prop;
+ struct memblock mem;
- prop.name = "PSTORE/ATAGS/SHM";
- prop.base = SDRAM_OFFSET(SZ_1M);
- prop.size = SZ_1M;
-
- return prop;
+#ifdef CONFIG_ARM64
+ mem.base = SDRAM_OFFSET(SZ_1M);
+ mem.size = SZ_1M;
+#else
+ mem.size = 0;
+#endif
+ return mem;
}
int param_parse_bootdev(char **devtype, char **devnum)
@@ -196,3 +199,70 @@ int param_parse_bootdev(char **devtype, char **devnum)
return -ENOSYS;
}
+#endif
+
+struct memblock *param_parse_ddr_mem(int *out_count)
+{
+ struct udevice *dev;
+ struct memblock *mem;
+ struct ram_info ram;
+ int i, ret, count;
+
+ /*
+ * Get memory region of DDR
+ *
+ * 1. New: atags info;
+ * 2. Leagcy: os register;
+ */
+#ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS
+ struct tag *t;
+
+ t = atags_get_tag(ATAG_DDR_MEM);
+ if (t && t->u.ddr_mem.count) {
+ count = t->u.ddr_mem.count;
+ mem = calloc(count, sizeof(*mem));
+ if (!mem) {
+ printf("Calloc ddr memory failed\n");
+ return 0;
+ }
+
+ for (i = 0; i < count; i++) {
+ mem[i].base = t->u.ddr_mem.bank[i];
+ mem[i].size = t->u.ddr_mem.bank[i + count];
+ }
+
+ *out_count = count;
+ return mem;
+ }
+#endif
+
+ /* Leagcy */
+ ret = uclass_get_device(UCLASS_RAM, 0, &dev);
+ if (ret) {
+ debug("DRAM init failed: %d\n", ret);
+ return NULL;
+ }
+ ret = ram_get_info(dev, &ram);
+ if (ret) {
+ debug("Cannot get DRAM size: %d\n", ret);
+ return NULL;
+ }
+
+ debug("SDRAM base=%lx, size=%lx\n",
+ (unsigned long)ram.base, (unsigned long)ram.size);
+
+ count = 1;
+ mem = calloc(1, sizeof(*mem));
+ if (!mem) {
+ printf("Calloc ddr memory failed\n");
+ return 0;
+ }
+
+ for (i = 0; i < count; i++) {
+ mem[i].base = CONFIG_SYS_SDRAM_BASE;
+ mem[i].size = ram.size;
+ }
+
+ *out_count = count;
+ return mem;
+}
diff --git a/arch/arm/mach-rockchip/resource_img.c b/arch/arm/mach-rockchip/resource_img.c
index 477aae70b2..50598d89fd 100755
--- a/arch/arm/mach-rockchip/resource_img.c
+++ b/arch/arm/mach-rockchip/resource_img.c
@@ -6,6 +6,7 @@
#include <common.h>
#include <adc.h>
#include <asm/io.h>
+#include <fs.h>
#include <malloc.h>
#include <sysmem.h>
#include <linux/list.h>
@@ -212,11 +213,16 @@ static int init_resource_list(struct resource_img_hdr *hdr)
#ifdef CONFIG_ANDROID_AB
char slot_suffix[3] = {0};
- if (rk_avb_get_current_slot(slot_suffix))
+ if (rk_avb_get_current_slot(slot_suffix)) {
+ ret = -ENODEV;
goto out;
+ }
+
boot_partname = android_str_append(boot_partname, slot_suffix);
- if (boot_partname == NULL)
+ if (!boot_partname) {
+ ret = -EINVAL;
goto out;
+ }
#endif
ret = part_get_info_by_name(dev_desc, boot_partname, &part_info);
if (ret < 0) {
@@ -235,6 +241,7 @@ static int init_resource_list(struct resource_img_hdr *hdr)
if (ret != 1) {
printf("%s: failed to read %s hdr, ret=%d\n",
__func__, part_info.name, ret);
+ ret = -EIO;
goto out;
}
ret = android_image_check_header(andr_hdr);
@@ -274,17 +281,21 @@ next:
if (ret != 1) {
printf("%s: failed to read resource hdr, ret=%d\n",
__func__, ret);
+ ret = -EIO;
goto out;
}
ret = resource_image_check_header(hdr);
- if (ret < 0)
+ if (ret < 0) {
+ ret = -EINVAL;
goto out;
+ }
content = memalign(ARCH_DMA_MINALIGN,
hdr->e_blks * hdr->e_nums * RK_BLK_SIZE);
if (!content) {
printf("%s: failed to alloc memory for content\n", __func__);
+ ret = -ENOMEM;
goto out;
}
@@ -294,6 +305,7 @@ next:
if (ret != (hdr->e_blks * hdr->e_nums)) {
printf("%s: failed to read resource entries, ret=%d\n",
__func__, ret);
+ ret = -EIO;
goto err;
}
@@ -303,13 +315,14 @@ next:
add_file_to_list(entry, offset);
}
+ ret = 0;
printf("Load FDT from %s part\n", boot_partname);
err:
free(content);
out:
free(hdr);
- return 0;
+ return ret;
}
static struct resource_file *get_file_info(struct resource_img_hdr *hdr,
@@ -318,8 +331,10 @@ static struct resource_file *get_file_info(struct resource_img_hdr *hdr,
struct resource_file *file;
struct list_head *node;
- if (list_empty(&entrys_head))
- init_resource_list(hdr);
+ if (list_empty(&entrys_head)) {
+ if (init_resource_list(hdr))
+ return NULL;
+ }
list_for_each(node, &entrys_head) {
file = list_entry(node, struct resource_file, link);
@@ -614,15 +629,73 @@ static int rockchip_read_dtb_by_gpio(const char *file_name)
return found ? 0 : -ENOENT;
}
+#ifdef CONFIG_ROCKCHIP_EARLY_DISTRO_DTB
+static int rockchip_read_distro_dtb_file(char *fdt_addr)
+{
+ const char *cmd = "part list ${devtype} ${devnum} -bootable devplist";
+ char *devnum, *devtype, *devplist;
+ char devnum_part[12];
+ char fdt_hex_str[19];
+ char *fs_argv[5];
+ int ret;
+
+ if (!rockchip_get_bootdev() || !fdt_addr)
+ return -ENODEV;
+
+ ret = run_command_list(cmd, -1, 0);
+ if (ret)
+ return ret;
+
+ devplist = env_get("devplist");
+ if (!devplist)
+ return -ENODEV;
+
+ devtype = env_get("devtype");
+ devnum = env_get("devnum");
+ sprintf(devnum_part, "%s:%s", devnum, devplist);
+ sprintf(fdt_hex_str, "0x%lx", (ulong)fdt_addr);
+
+#ifdef CONFIG_CMD_FS_GENERIC
+ fs_argv[0] = "load";
+ fs_argv[1] = devtype,
+ fs_argv[2] = devnum_part;
+ fs_argv[3] = fdt_hex_str;
+ fs_argv[4] = CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH;
+
+ if (do_load(NULL, 0, 5, fs_argv, FS_TYPE_ANY))
+ return -EIO;
+#endif
+ if (fdt_check_header(fdt_addr))
+ return -EIO;
+
+ return fdt_totalsize(fdt_addr);
+}
+#endif
+
int rockchip_read_dtb_file(void *fdt_addr)
{
struct resource_file *file;
struct list_head *node;
char *dtb_name = DTB_FILE;
- int ret, size;
-
- if (list_empty(&entrys_head))
- init_resource_list(NULL);
+ int size = -ENODEV;
+
+ if (list_empty(&entrys_head)) {
+ if (init_resource_list(NULL)) {
+#ifdef CONFIG_ROCKCHIP_EARLY_DISTRO_DTB
+ /* Maybe a distro boot.img with dtb ? */
+ printf("Distro DTB: %s\n",
+ CONFIG_ROCKCHIP_EARLY_DISTRO_DTB_PATH);
+ size = rockchip_read_distro_dtb_file(fdt_addr);
+ if (size < 0)
+ return size;
+ if (!sysmem_alloc_base(MEMBLK_ID_FDT,
+ (phys_addr_t)fdt_addr,
+ ALIGN(size, RK_BLK_SIZE) + CONFIG_SYS_FDT_PAD))
+ return -ENOMEM;
+#endif
+ return size;
+ }
+ }
list_for_each(node, &entrys_head) {
file = list_entry(node, struct resource_file, link);
@@ -647,17 +720,17 @@ int rockchip_read_dtb_file(void *fdt_addr)
if (size < 0)
return size;
- if (!sysmem_alloc_base("fdt", (phys_addr_t)fdt_addr,
+ if (!sysmem_alloc_base(MEMBLK_ID_FDT, (phys_addr_t)fdt_addr,
ALIGN(size, RK_BLK_SIZE) + CONFIG_SYS_FDT_PAD))
return -ENOMEM;
- ret = rockchip_read_resource_file((void *)fdt_addr, dtb_name, 0, 0);
- if (ret < 0)
- return ret;
+ size = rockchip_read_resource_file((void *)fdt_addr, dtb_name, 0, 0);
+ if (size < 0)
+ return size;
#if defined(CONFIG_CMD_DTIMG) && defined(CONFIG_OF_LIBFDT_OVERLAY)
android_fdt_overlay_apply((void *)fdt_addr);
#endif
- return ret;
+ return size;
}
diff --git a/arch/arm/mach-rockchip/rk3308/rk3308.c b/arch/arm/mach-rockchip/rk3308/rk3308.c
index c864b31c2e..0d11073ddf 100644
--- a/arch/arm/mach-rockchip/rk3308/rk3308.c
+++ b/arch/arm/mach-rockchip/rk3308/rk3308.c
@@ -10,6 +10,8 @@
#include <asm/gpio.h>
#include <debug_uart.h>
+DECLARE_GLOBAL_DATA_PTR;
+
#ifdef CONFIG_ARM64
#include <asm/armv8/mmu.h>
static struct mm_region rk3308_mem_map[] = {
@@ -125,6 +127,9 @@ void board_debug_uart_init(void)
{
static struct rk3308_grf * const grf = (void *)GRF_BASE;
+ if (gd && gd->serial.using_pre_serial)
+ return;
+
/* Enable early UART2 channel m1 on the rk3308 */
rk_clrsetreg(&grf->soc_con5, UART2_IO_SEL_MASK,
UART2_IO_SEL_M1 << UART2_IO_SEL_SHIFT);
diff --git a/arch/arm/mach-rockchip/rk3368/rk3368.c b/arch/arm/mach-rockchip/rk3368/rk3368.c
index e82b631138..46e63c9d7f 100644
--- a/arch/arm/mach-rockchip/rk3368/rk3368.c
+++ b/arch/arm/mach-rockchip/rk3368/rk3368.c
@@ -66,13 +66,13 @@ static struct mm_region rk3368_mem_map[] = {
{
.virt = 0x0UL,
.phys = 0x0UL,
- .size = 0x80000000UL,
+ .size = 0xfe000000UL,
.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
PTE_BLOCK_INNER_SHARE
}, {
- .virt = 0xf0000000UL,
- .phys = 0xf0000000UL,
- .size = 0x10000000UL,
+ .virt = 0xfe000000UL,
+ .phys = 0xfe000000UL,
+ .size = 0x02000000UL,
.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
PTE_BLOCK_NON_SHARE |
PTE_BLOCK_PXN | PTE_BLOCK_UXN
@@ -242,10 +242,12 @@ void board_debug_uart_init(void)
GPIO2A6_MASK = GENMASK(13, 12),
GPIO2A6_GPIO = 0,
GPIO2A6_UART0_SIN = (1 << 13),
+ GPIO2A6_UART2_SIN = (2 << 12),
GPIO2A5_MASK = GENMASK(11, 10),
GPIO2A5_GPIO = 0,
GPIO2A5_UART0_SOUT = (1 << 11),
+ GPIO2A5_UART2_SOUT = (2 << 10),
};
#if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff180000)
@@ -254,12 +256,31 @@ void board_debug_uart_init(void)
GPIO2D0_MASK, GPIO2D0_UART0_SIN);
rk_clrsetreg(&grf->gpio2d_iomux,
GPIO2D1_MASK, GPIO2D1_UART0_SOUT);
+#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff1c0000)
+ struct rk3368_pmu_grf * const pmugrf __maybe_unused =
+ (struct rk3368_pmu_grf * const)0xff738000;
+
+ enum {
+ /* UART4 */
+ GPIO0D2_MASK = GENMASK(5, 4),
+ GPIO0D2_GPIO = 0,
+ GPIO0D2_UART4_SOUT = (3 << 4),
+
+ GPIO0D3_MASK = GENMASK(7, 6),
+ GPIO0D3_GPIO = 0,
+ GPIO0D3_UART4_SIN = (3 << 6),
+ };
+
+ /* Enable early UART4 on the PX5 */
+ rk_clrsetreg(&pmugrf->gpio0d_iomux,
+ GPIO0D2_MASK | GPIO0D3_MASK,
+ GPIO0D2_UART4_SOUT | GPIO0D3_UART4_SIN);
#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff690000)
/* Enable early UART2 on the RK3368 */
rk_clrsetreg(&grf->gpio2a_iomux,
- GPIO2A6_MASK, GPIO2A6_UART0_SIN);
+ GPIO2A6_MASK, GPIO2A6_UART2_SIN);
rk_clrsetreg(&grf->gpio2a_iomux,
- GPIO2A5_MASK, GPIO2A5_UART0_SOUT);
+ GPIO2A5_MASK, GPIO2A5_UART2_SOUT);
#endif
}
diff --git a/arch/arm/mach-rockchip/rk_atags.c b/arch/arm/mach-rockchip/rk_atags.c
index cde2f23a3e..be5dfecad7 100644
--- a/arch/arm/mach-rockchip/rk_atags.c
+++ b/arch/arm/mach-rockchip/rk_atags.c
@@ -10,6 +10,7 @@
#include <debug_uart.h>
#endif
+#define HASH_LEN sizeof(u32)
#define tag_next(t) ((struct tag *)((u32 *)(t) + (t)->hdr.size))
#define tag_size(type) ((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
#define for_each_tag(t, base) \
@@ -72,11 +73,36 @@ void *memcpy(void *dest, const void *src, size_t count)
}
#endif
-static int inline bad_magic(u32 magic)
+static u32 js_hash(void *buf, u32 len)
{
- return ((magic != ATAG_CORE) &&
- (magic != ATAG_NONE) &&
- (magic < ATAG_SERIAL || magic > ATAG_MAX));
+ u32 i, hash = 0x47C6A7E6;
+ char *data = buf;
+
+ if (!buf || !len)
+ return hash;
+
+ for (i = 0; i < len; i++)
+ hash ^= ((hash << 5) + data[i] + (hash >> 2));
+
+ return hash;
+}
+
+static int bad_magic(u32 magic)
+{
+ bool bad;
+
+ bad = ((magic != ATAG_CORE) &&
+ (magic != ATAG_NONE) &&
+ (magic < ATAG_SERIAL || magic > ATAG_MAX));
+ if (bad) {
+#if !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
+ printf("Magic(%x) is not support\n", magic);
+#else
+ printascii("Magic is not support\n");
+#endif
+ }
+
+ return bad;
}
static int inline atags_size_overflow(struct tag *t, u32 tag_size)
@@ -84,6 +110,23 @@ static int inline atags_size_overflow(struct tag *t, u32 tag_size)
return (unsigned long)t + (tag_size << 2) - ATAGS_PHYS_BASE > ATAGS_SIZE;
}
+static int atags_overflow(struct tag *t)
+{
+ bool overflow;
+
+ overflow = atags_size_overflow(t, 0) ||
+ atags_size_overflow(t, t->hdr.size);
+ if (overflow) {
+#if !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
+ printf("Tag is overflow\n");
+#else
+ printascii("Tag is overflow\n");
+#endif
+ }
+
+ return overflow;
+}
+
int atags_is_available(void)
{
struct tag *t = (struct tag *)ATAGS_PHYS_BASE;
@@ -93,21 +136,14 @@ int atags_is_available(void)
int atags_set_tag(u32 magic, void *tagdata)
{
- u32 length, size = 0;
+ u32 length, size = 0, hash;
struct tag *t = (struct tag *)ATAGS_PHYS_BASE;
if (!tagdata)
return -ENODATA;
- if (bad_magic(magic)) {
-#if !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
- printf("%s: magic(%x) is not support\n", __func__, magic);
-#else
- printascii("magic is not support\n");
-#endif
-
+ if (bad_magic(magic))
return -EINVAL;
- }
/* Not allowed to be set by user directly, so do nothing */
if ((magic == ATAG_CORE) || (magic == ATAG_NONE))
@@ -125,21 +161,15 @@ int atags_set_tag(u32 magic, void *tagdata)
} else {
/* Find the end, and use it as a new tag */
for_each_tag(t, (struct tag *)ATAGS_PHYS_BASE) {
- /*
- * We had better check magic to avoid traversing an
- * unknown tag, in case of atags has been damaged by
- * some unknown reason.
- */
- if (bad_magic(t->hdr.magic)) {
-#if !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
- printf("%s: find unknown magic(%x)\n",
- __func__, t->hdr.magic);
-#else
- printascii("find unknown magic\n");
-#endif
+ if (atags_overflow(t))
+ return -EINVAL;
+ if (bad_magic(t->hdr.magic))
return -EINVAL;
- }
+
+ /* This is an old tag, override it */
+ if (t->hdr.magic == magic)
+ break;
if (t->hdr.magic == ATAG_NONE)
break;
@@ -166,24 +196,27 @@ int atags_set_tag(u32 magic, void *tagdata)
case ATAG_ATF_MEM:
size = tag_size(tag_atf_mem);
break;
+ case ATAG_PUB_KEY:
+ size = tag_size(tag_pub_key);
+ break;
+ case ATAG_SOC_INFO:
+ size = tag_size(tag_soc_info);
+ break;
};
- if (atags_size_overflow(t, size)) {
-#if !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
- printf("%s: failed! no memory to setup magic(%x), max_mem=0x%x\n",
- __func__, magic, ATAGS_SIZE);
-#else
- printascii("no memory to setup magic\n");
-#endif
+ if (!size)
+ return -EINVAL;
+ if (atags_size_overflow(t, size))
return -ENOMEM;
- }
/* It's okay to setup a new tag */
t->hdr.magic = magic;
t->hdr.size = size;
- length = (t->hdr.size << 2) - sizeof(struct tag_header);
+ length = (t->hdr.size << 2) - sizeof(struct tag_header) - HASH_LEN;
memcpy(&t->u, (char *)tagdata, length);
+ hash = js_hash(t, (size << 2) - HASH_LEN);
+ memcpy((char *)&t->u + length, &hash, HASH_LEN);
/* Next tag */
t = tag_next(t);
@@ -197,24 +230,38 @@ int atags_set_tag(u32 magic, void *tagdata)
struct tag *atags_get_tag(u32 magic)
{
+ u32 *hash, calc_hash, size;
struct tag *t;
if (!atags_is_available())
return NULL;
for_each_tag(t, (struct tag *)ATAGS_PHYS_BASE) {
- if (bad_magic(t->hdr.magic)) {
-#if !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
- printf("%s: find unknown magic(%x)\n",
- __func__, t->hdr.magic);
-#else
- printascii("find unknown magic\n");
-#endif
+ if (atags_overflow(t))
return NULL;
- }
- if (t->hdr.magic == magic)
+ if (bad_magic(t->hdr.magic))
+ return NULL;
+
+ if (t->hdr.magic != magic)
+ continue;
+
+ size = t->hdr.size;
+ hash = (u32 *)((ulong)t + (size << 2) - HASH_LEN);
+ if (!*hash) {
+ debug("No hash, magic(%x)\n", magic);
return t;
+ } else {
+ calc_hash = js_hash(t, (size << 2) - HASH_LEN);
+ if (calc_hash == *hash) {
+ debug("Hash okay, magic(%x)\n", magic);
+ return t;
+ } else {
+ debug("Hash bad, magic(%x), orgHash=%x, nowHash=%x\n",
+ magic, *hash, calc_hash);
+ return NULL;
+ }
+ }
}
return NULL;
@@ -234,12 +281,15 @@ void atags_stat(void)
u32 start = ATAGS_PHYS_BASE, end = ATAGS_PHYS_BASE + ATAGS_SIZE;
struct tag *t;
+ if (!atags_is_available())
+ return;
+
for_each_tag(t, (struct tag *)ATAGS_PHYS_BASE) {
- if (bad_magic(t->hdr.magic)) {
- printf("%s: find unknown magic(%x)\n",
- __func__, t->hdr.magic);
+ if (atags_overflow(t))
+ return;
+
+ if (bad_magic(t->hdr.magic))
return;
- }
in_use += (t->hdr.size << 2);
}
@@ -273,6 +323,7 @@ void atags_print_tag(struct tag *t)
printf(" id = 0x%x\n", t->u.serial.id);
for (i = 0; i < ARRAY_SIZE(t->u.serial.reserved); i++)
printf(" res[%d] = 0x%x\n", i, t->u.serial.reserved[i]);
+ printf(" hash = 0x%x\n", t->u.serial.hash);
break;
case ATAG_BOOTDEV:
printf("[bootdev]:\n");
@@ -285,6 +336,7 @@ void atags_print_tag(struct tag *t)
for (i = 0; i < ARRAY_SIZE(t->u.bootdev.reserved); i++)
printf(" res[%d] = 0x%x\n",
i, t->u.bootdev.reserved[i]);
+ printf(" hash = 0x%x\n", t->u.bootdev.hash);
break;
case ATAG_TOS_MEM:
printf("[tos_mem]:\n");
@@ -303,6 +355,8 @@ void atags_print_tag(struct tag *t)
printf(" flags = 0x%x\n", t->u.tos_mem.drm_mem.flags);
for (i = 0; i < ARRAY_SIZE(t->u.tos_mem.reserved); i++)
printf(" res[%d] = 0x%llx\n", i, t->u.tos_mem.reserved[i]);
+ printf(" res1 = 0x%x\n", t->u.tos_mem.reserved1);
+ printf(" hash = 0x%x\n", t->u.tos_mem.hash);
break;
case ATAG_DDR_MEM:
printf("[ddr_mem]:\n");
@@ -314,6 +368,7 @@ void atags_print_tag(struct tag *t)
printf(" bank[%d] = 0x%llx\n", i, t->u.ddr_mem.bank[i]);
for (i = 0; i < ARRAY_SIZE(t->u.ddr_mem.reserved); i++)
printf(" res[%d] = 0x%x\n", i, t->u.ddr_mem.reserved[i]);
+ printf(" hash = 0x%x\n", t->u.ddr_mem.hash);
break;
case ATAG_RAM_PARTITION:
printf("[ram_partition]:\n");
@@ -324,11 +379,14 @@ void atags_print_tag(struct tag *t)
printf(" res[%d] = 0x%x\n", i, t->u.ram_part.reserved[i]);
printf(" Part: Name Start Addr Size\t\n");
- for (i = 0; i < t->u.ram_part.count; i++)
+ for (i = 0; i < ARRAY_SIZE(t->u.ram_part.part); i++)
printf("%16s 0x%08llx 0x%08llx\n",
t->u.ram_part.part[i].name,
t->u.ram_part.part[i].start,
t->u.ram_part.part[i].size);
+ for (i = 0; i < ARRAY_SIZE(t->u.ram_part.reserved1); i++)
+ printf(" res1[%d] = 0x%x\n", i, t->u.ram_part.reserved1[i]);
+ printf(" hash = 0x%x\n", t->u.ram_part.hash);
break;
case ATAG_ATF_MEM:
printf("[atf_mem]:\n");
@@ -339,6 +397,25 @@ void atags_print_tag(struct tag *t)
printf(" size = 0x%x\n", t->u.atf_mem.size);
for (i = 0; i < ARRAY_SIZE(t->u.atf_mem.reserved); i++)
printf(" res[%d] = 0x%x\n", i, t->u.atf_mem.reserved[i]);
+ printf(" hash = 0x%x\n", t->u.atf_mem.hash);
+ break;
+ case ATAG_PUB_KEY:
+ printf("[pub_key_mem]:\n");
+ printf(" magic = 0x%x\n", t->hdr.magic);
+ printf(" size = 0x%x\n\n", t->hdr.size << 2);
+ printf(" version = 0x%x\n", t->u.pub_key.version);
+ printf(" hash = 0x%x\n", t->u.pub_key.hash);
+ break;
+ case ATAG_SOC_INFO:
+ printf("[soc_info]:\n");
+ printf(" magic = 0x%x\n", t->hdr.magic);
+ printf(" size = 0x%x\n\n", t->hdr.size << 2);
+ printf(" version = 0x%x\n", t->u.soc.version);
+ printf(" name = 0x%x\n", t->u.soc.name);
+ printf(" flags = 0x%x\n", t->u.soc.flags);
+ for (i = 0; i < ARRAY_SIZE(t->u.soc.reserved); i++)
+ printf(" res[%d] = 0x%x\n", i, t->u.soc.reserved[i]);
+ printf(" hash = 0x%x\n", t->u.soc.hash);
break;
case ATAG_CORE:
printf("[core]:\n");
@@ -359,12 +436,15 @@ void atags_print_all_tags(void)
{
struct tag *t;
+ if (!atags_is_available())
+ return;
+
for_each_tag(t, (struct tag *)ATAGS_PHYS_BASE) {
- if (bad_magic(t->hdr.magic)) {
- printf("%s: find unknown magic(%x)\n",
- __func__, t->hdr.magic);
+ if (atags_overflow(t))
+ return;
+
+ if (bad_magic(t->hdr.magic))
return;
- }
atags_print_tag(t);
}
@@ -378,6 +458,8 @@ void atags_test(void)
struct tag_tos_mem t_tos_mem;
struct tag_ram_partition t_ram_param;
struct tag_atf_mem t_atf_mem;
+ struct tag_pub_key t_pub_key;
+ struct tag_soc_info t_soc;
memset(&t_serial, 0x1, sizeof(t_serial));
memset(&t_bootdev, 0x2, sizeof(t_bootdev));
@@ -385,6 +467,8 @@ void atags_test(void)
memset(&t_tos_mem, 0x4, sizeof(t_tos_mem));
memset(&t_ram_param, 0x0, sizeof(t_ram_param));
memset(&t_atf_mem, 0x5, sizeof(t_atf_mem));
+ memset(&t_pub_key, 0x6, sizeof(t_pub_key));
+ memset(&t_soc, 0x7, sizeof(t_soc));
memcpy(&t_tos_mem.tee_mem.name, "tee_mem", 8);
memcpy(&t_tos_mem.drm_mem.name, "drm_mem", 8);
@@ -415,6 +499,8 @@ void atags_test(void)
atags_set_tag(ATAG_TOS_MEM, &t_tos_mem);
atags_set_tag(ATAG_RAM_PARTITION, &t_ram_param);
atags_set_tag(ATAG_ATF_MEM, &t_atf_mem);
+ atags_set_tag(ATAG_PUB_KEY, &t_pub_key);
+ atags_set_tag(ATAG_SOC_INFO, &t_soc);
atags_print_all_tags();
atags_stat();
diff --git a/arch/arm/mach-rockchip/rv1108/rv1108.c b/arch/arm/mach-rockchip/rv1108/rv1108.c
index 86bfdea237..e88f27f5d9 100644
--- a/arch/arm/mach-rockchip/rv1108/rv1108.c
+++ b/arch/arm/mach-rockchip/rv1108/rv1108.c
@@ -57,24 +57,3 @@ void board_debug_uart_init(void)
#endif
#endif /*CONFIG_SPL_BUILD*/
}
-
-int dram_init(void)
-{
- struct rv1108_grf *grf = (void *)GRF_BASE;
-
- gd->ram_size = rockchip_sdram_size((phys_addr_t)&grf->os_reg2);
-
- return 0;
-}
-
-int dram_init_banksize(void)
-{
- size_t max_size = min((unsigned long)(gd->ram_size +
- CONFIG_SYS_SDRAM_BASE), gd->ram_top);
-
- gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
- gd->bd->bi_dram[0].size = max_size - gd->bd->bi_dram[0].start;
-
- return 0;
-}
-
diff --git a/arch/arm/mach-rockchip/sdram_common.c b/arch/arm/mach-rockchip/sdram_common.c
index b0e1e4cf6e..f71aacc9cd 100644
--- a/arch/arm/mach-rockchip/sdram_common.c
+++ b/arch/arm/mach-rockchip/sdram_common.c
@@ -5,6 +5,7 @@
*/
#include <common.h>
+#include <bidram.h>
#include <dm.h>
#include <ram.h>
#include <asm/io.h>
@@ -17,185 +18,6 @@ DECLARE_GLOBAL_DATA_PTR;
#define PARAM_DRAM_INFO_OFFSET 0x2000000
#define TRUST_PARAMETER_OFFSET (34 * 1024 * 1024)
-#if defined(CONFIG_SPL_FRAMEWORK) || !defined(CONFIG_SPL_OF_PLATDATA)
-
-#define SDRAM_OFFSET(offset) (CONFIG_SYS_SDRAM_BASE + (offset))
-#define NOT_INITIAL -1
-static int __dram_init_banksize(int resv_tee)
-{
- struct sysmem_property prop;
- size_t top = min((unsigned long)(gd->ram_size + CONFIG_SYS_SDRAM_BASE),
- gd->ram_top);
- u64 start[CONFIG_NR_DRAM_BANKS], size[CONFIG_NR_DRAM_BANKS];
- u64 tos_addr, atf_addr;
- u64 tos_size, atf_size;
- int i, idx = NOT_INITIAL;
-
- prop = param_parse_atf_mem();
- atf_addr = prop.base;
- atf_size = prop.size;
- prop = param_parse_optee_mem();
- tos_addr = prop.base;
- tos_size = prop.size;
-
- /*
- * Reserve region for ATF bl31
- *
- * What ever U-Boot runs on AArch64 or AArch32 mode, the bl31 is always
- * present and AArch64 mode, let's reserve it.
- *
- * Maybe:
- * 1. ATF region is from 0x0 offset and 1MB size(legacy);
- * 2. ATF region is from 0x0 offset but not 1MB size;
- * 3. ATF region is not from 0x0 offset but within 1MB;
- *
- * 1. The "*****" means visible region to kernel.
- * 2. 1M~2M is always reserved in ARM64 for pstore, shmem, etc.
- *
- *
- * Possible memory layout:
- *
- * Leagcy:
- * |------------o-------o------------------------|
- * | ATF | RES |************************|
- * |------------o-------o------------------------|
- * 0x0 1M 2M .....
- *
- *
- * New:
- * |-----|------o-------o------------------------|
- * | ATF |******| RES |************************|
- * |-----|------o-------o------------------------|
- * 0x0 1M 2M .....
- *
- *
- * |----|---|---o-------o------------------------|
- * |****|ATF|***| RES |************************|
- * |----|---|---o-------o------------------------|
- * 0x0 64K 1M 2M .....
- *
- * Note: these are only initilized once from dram_init_banksize(),
- * which is before relocation.
- */
- if (atf_size && !(gd->flags & GD_FLG_RELOC)) {
- idx = 0;
- memset(size, 0, sizeof(size));
-
- start[0] = SDRAM_OFFSET(0);
- size[0] = atf_addr - start[0];
- start[1] = atf_addr + atf_size;
- size[1] = SDRAM_OFFSET(SZ_1M) - start[1];
- start[2] = SDRAM_OFFSET(SZ_2M);
- size[2] = top - start[2];
-
- for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
- if (!size[i])
- continue;
-
- gd->bd->bi_dram[idx].start = start[i];
- gd->bd->bi_dram[idx].size = size[i];
- idx++;
- }
- /* There is no bl31, fill whole ram size */
- } else if (!(gd->flags & GD_FLG_RELOC)) {
- gd->bd->bi_dram[0].start = SDRAM_OFFSET(0);
- gd->bd->bi_dram[0].size = top - gd->bd->bi_dram[0].start;
- } else {
- /*
- * Do nothing for bl31 when called from dram_initr_banksize(),
- * which is after relocation.
- */
- }
-
- /*
- * Reserve region for OP-TEE
- *
- * What ever U-Boot runs on AArch64 or AArch32 mode, the OP-TEE is
- * AArch64 mode.
- *
- * For OP-TEE:
- * AArch64: dcache is enabled;
- * AArch32: dcache is disabled(due to some unknown issues);
- *
- * For the data coherence, U-Boot has to follow the OP-TEE dcache
- * policy to map MMU attributes of OP-TEE region.
- *
- * For AArch64: MMU translate table is created manual by rkxxx.c file
- * and all memory region is mapped, that's good to match OP-TEE policy.
- * For AArch32: MMU translate table is setup according to bi_dram[..]
- * that OP-TEE region has been reserved and would not be mapped,
- * i.e. dcache is disabled, that's also good to match OP-TEE policy.
- *
- * When CONFIG_ARM64_BOOT_AARCH32 is enabled, U-Boot runs on AArch32
- * while OP-TEE runs on AArch64. U-Boot shouldn't reserved OP-TEE region
- * too early and should map MMU translate table of it(in intir_cache()).
- * So we reserve the region in dram_initr_banksize() after MMU setup.
- *
- *
- * The are two kinds of OP-TEE memory layout
- *
- * legacy:
- * |----|-------o---------------------------------|
- * |....| OPTEE |*********************************|
- * |----|-------o---------------------------------|
- * 0x0 2M 6M(or more) .....
- *
- * new:
- * |----|-------------------o-------o-------------|
- * |....|*******************| OPTEE |*************|
- * |----|-------------------o-------o-------------|
- * 0x0 2M 132M 164M(or less) .....
- */
-
- if (resv_tee && tos_size) {
- /* If idx is not initialized, calculate idx */
- if (idx == NOT_INITIAL) {
- for (idx = 0; idx < CONFIG_NR_DRAM_BANKS; idx++) {
- if (!gd->bd->bi_dram[idx].size)
- break;
- }
- }
-
- if (tos_addr == SZ_2M) {
- gd->bd->bi_dram[idx - 1].start = tos_addr + tos_size;
- gd->bd->bi_dram[idx - 1].size =
- top - gd->bd->bi_dram[idx - 1].start;
- } else {
- gd->bd->bi_dram[idx - 1].size = tos_addr -
- gd->bd->bi_dram[idx - 1].start;
- gd->bd->bi_dram[idx].start = tos_addr + tos_size;
- gd->bd->bi_dram[idx].size =
- top - gd->bd->bi_dram[idx].start;
- }
-#ifdef DEBUG
- for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
- debug("%s: bank[%d]=0x%llx-0x%llx\n",
- __func__, i, (u64)gd->bd->bi_dram[i].start,
- (u64)gd->bd->bi_dram[i].start +
- gd->bd->bi_dram[i].size);
- }
-#endif
- }
-
- return 0;
-}
-
-/*
- * !defined(CONFIG_ARM64_BOOT_AARCH32) means: U-Boot and OP-TEE both run
- * on AArch32 or AArch64, they are same mode. Otherwise OP-TEE is AArch64
- * while U-Boot is AArch32. There is data cache coherence issue to fix.
- */
-int dram_init_banksize(void)
-{
- return __dram_init_banksize(!IS_ENABLED(CONFIG_ARM64_BOOT_AARCH32));
-}
-
-int dram_initr_banksize(void)
-{
- return __dram_init_banksize(IS_ENABLED(CONFIG_ARM64_BOOT_AARCH32));
-}
-#endif
-
size_t rockchip_sdram_size(phys_addr_t reg)
{
u32 rank, cs0_col, bk, cs0_row, cs1_row, bw, row_3_4;
@@ -347,47 +169,18 @@ unsigned int get_ddr_bw(void)
}
#if defined(CONFIG_SPL_FRAMEWORK) || !defined(CONFIG_SPL_OF_PLATDATA)
-int dram_init(void)
+int dram_init_banksize(void)
{
- struct ram_info ram;
- struct udevice *dev;
- int ret;
-
- /* New way: atags info */
-#ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS
- struct tag *t = NULL;
- int i, count;
-
- t = atags_get_tag(ATAG_DDR_MEM);
- if (t && t->u.ddr_mem.count) {
- gd->ram_size = 0;
- count = t->u.ddr_mem.count;
+ bidram_gen_gd_bi_dram();
- for (i = 0; i < count; i++) {
- gd->ram_size += t->u.ddr_mem.bank[i + count];
- debug("%s: ram[%d] start=0x%08llx, size=0x%08llx, sum=0x%08llx\n",
- __func__, i, (u64)gd->bd->bi_dram[i].start,
- (u64)gd->bd->bi_dram[i].size, (u64)gd->ram_size);
- }
-
- return 0;
- }
-#endif
+ return 0;
+}
- /* Legacy way: os registers */
- ret = uclass_get_device(UCLASS_RAM, 0, &dev);
- if (ret) {
- debug("DRAM init failed: %d\n", ret);
- return ret;
- }
- ret = ram_get_info(dev, &ram);
- if (ret) {
- debug("Cannot get DRAM size: %d\n", ret);
- return ret;
- }
- gd->ram_size = ram.size;
- debug("SDRAM base=%lx, size=%lx\n",
- (unsigned long)ram.base, (unsigned long)ram.size);
+int dram_init(void)
+{
+ gd->ram_size = bidram_get_ram_size();
+ if (!gd->ram_size)
+ return -ENOMEM;
return 0;
}
diff --git a/arch/arm/mach-rockchip/spl.c b/arch/arm/mach-rockchip/spl.c
index 2c1ffe5ab0..1db0e2626c 100644
--- a/arch/arm/mach-rockchip/spl.c
+++ b/arch/arm/mach-rockchip/spl.c
@@ -64,7 +64,10 @@ u32 spl_boot_mode(const u32 boot_device)
__weak void rockchip_stimer_init(void)
{
-#ifdef CONFIG_SYS_ARCH_TIMER
+ /* If Timer already enabled, don't re-init it */
+ u32 reg = readl(CONFIG_ROCKCHIP_STIMER_BASE + 0x10);
+ if ( reg & 0x1 )
+ return;
#ifndef CONFIG_ARM64
asm volatile("mcr p15, 0, %0, c14, c0, 0"
: : "r"(COUNTER_FREQUENCY));
@@ -73,7 +76,6 @@ __weak void rockchip_stimer_init(void)
writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE);
writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE + 4);
writel(1, CONFIG_ROCKCHIP_STIMER_BASE + 0x10);
-#endif
}
__weak int arch_cpu_init(void)
@@ -145,10 +147,7 @@ void board_init_f(ulong dummy)
#endif
#endif
-#if !defined(CONFIG_SUPPORT_TPL)
rockchip_stimer_init();
- arch_cpu_init();
-#endif
#define EARLY_UART
#if defined(EARLY_UART) && defined(CONFIG_DEBUG_UART)
/*
@@ -183,6 +182,7 @@ void board_init_f(ulong dummy)
sdram_init();
#endif
+ arch_cpu_init();
rk_board_init_f();
#if CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM) && !defined(CONFIG_SPL_BOARD_INIT)
back_to_bootrom(BROM_BOOT_NEXTSTAGE);
diff --git a/arch/arm/mach-rockchip/tpl.c b/arch/arm/mach-rockchip/tpl.c
index 73e4ed386c..a6676e483a 100644
--- a/arch/arm/mach-rockchip/tpl.c
+++ b/arch/arm/mach-rockchip/tpl.c
@@ -114,11 +114,6 @@ __weak void rockchip_stimer_init(void)
writel(1, CONFIG_ROCKCHIP_STIMER_BASE + 0x10);
}
-__weak int arch_cpu_init(void)
-{
- return 0;
-}
-
void board_init_f(ulong dummy)
{
#if defined(CONFIG_SPL_FRAMEWORK) && !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
@@ -127,7 +122,6 @@ void board_init_f(ulong dummy)
#endif
rockchip_stimer_init();
- arch_cpu_init();
#define EARLY_DEBUG
#ifdef EARLY_DEBUG
/*
diff --git a/cmd/bootrkp.c b/cmd/bootrkp.c
index f2671045a5..e57cc28a63 100755
--- a/cmd/bootrkp.c
+++ b/cmd/bootrkp.c
@@ -26,7 +26,7 @@ static int do_boot_rockchip(cmd_tbl_t *cmdtp, int flag, int argc,
dev_desc = rockchip_get_bootdev();
if (!dev_desc) {
printf("%s: dev_desc is NULL!\n", __func__);
- return -ENODEV;
+ return CMD_RET_FAILURE;
}
#ifdef CONFIG_ANDROID_KEYMASTER_CA
diff --git a/cmd/dvfs.c b/cmd/dvfs.c
index 73a6f06a1e..ac51077b7e 100644
--- a/cmd/dvfs.c
+++ b/cmd/dvfs.c
@@ -15,7 +15,8 @@ static int do_dvfs(cmd_tbl_t *cmdtp, int flag,
ret = uclass_get_device(UCLASS_DVFS, 0, &dev);
if (ret) {
- printf("DVFS: Get dvfs device failed, ret=%d\n", ret);
+ if (ret != -ENODEV)
+ printf("DVFS: Get dvfs device failed, ret=%d\n", ret);
return ret;
}
diff --git a/cmd/fastboot.c b/cmd/fastboot.c
index 67aa7b8d7b..c9ef71da45 100644
--- a/cmd/fastboot.c
+++ b/cmd/fastboot.c
@@ -13,6 +13,7 @@
#include <g_dnl.h>
#include <net.h>
#include <usb.h>
+#include <sysmem.h>
static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
@@ -21,7 +22,6 @@ static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
char *usb_controller;
int ret;
#endif
-
if (argc < 2)
return CMD_RET_USAGE;
@@ -65,6 +65,13 @@ static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
goto exit;
}
+ if (!sysmem_alloc_base(MEMBLK_ID_FASTBOOT,
+ CONFIG_FASTBOOT_BUF_ADDR,
+ CONFIG_FASTBOOT_BUF_SIZE)) {
+ printf("The fastboot memory space is unusable!\n");
+ return CMD_RET_FAILURE;
+ }
+
printf("OK\n");
while (1) {
@@ -78,6 +85,7 @@ static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
ret = CMD_RET_SUCCESS;
exit:
+ sysmem_free(CONFIG_FASTBOOT_BUF_ADDR);
g_dnl_unregister();
g_dnl_clear_detach();
board_usb_cleanup(controller_index, USB_INIT_DEVICE);
diff --git a/cmd/optee.c b/cmd/optee.c
index f1140176b6..705ac87433 100644
--- a/cmd/optee.c
+++ b/cmd/optee.c
@@ -30,9 +30,13 @@ int test_secure_storage_default(void)
}
debug("%s start\n", __func__);
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return -1;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return -1;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -164,9 +168,13 @@ int test_secure_storage_security_partition(void)
}
debug("%s start\n", __func__);
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return -1;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return -1;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
diff --git a/cmd/rockusb.c b/cmd/rockusb.c
index 4062f368cf..c25df454a9 100644
--- a/cmd/rockusb.c
+++ b/cmd/rockusb.c
@@ -24,7 +24,7 @@ static int rkusb_read_sector(struct ums *ums_dev,
struct blk_desc *block_dev = &ums_dev->block_dev;
lbaint_t blkstart = start + ums_dev->start_sector;
- if (blkstart > RKUSB_READ_LIMIT_ADDR) {
+ if ((blkstart + blkcnt) > RKUSB_READ_LIMIT_ADDR) {
memset(buf, 0xcc, blkcnt * SECTOR_SIZE);
return blkcnt;
} else {
diff --git a/common/Kconfig b/common/Kconfig
index c4ef08fb82..f7a7dd952f 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -249,6 +249,11 @@ config CONSOLE_RECORD_IN_SIZE
The buffer is allocated immediately after the malloc() region is
ready.
+config CONSOLE_DISABLE_CTRLC
+ bool "disable ctrlc"
+ help
+ This disable ctrl+c when CONFIG_BOOTDELAY is 0.
+
config IDENT_STRING
string "Board specific string to be added to uboot version string"
help
diff --git a/common/android_bootloader.c b/common/android_bootloader.c
index af912f98de..e6da05a098 100644
--- a/common/android_bootloader.c
+++ b/common/android_bootloader.c
@@ -22,8 +22,12 @@
#include <keymaster.h>
#include <linux/libfdt_env.h>
#include <optee_include/OpteeClientInterface.h>
+#include <bidram.h>
+#include <console.h>
#include <sysmem.h>
+DECLARE_GLOBAL_DATA_PTR;
+
#define ANDROID_PARTITION_BOOT "boot"
#define ANDROID_PARTITION_MISC "misc"
#define ANDROID_PARTITION_OEM "oem"
@@ -304,14 +308,14 @@ static int android_bootloader_get_fdt(const char *part_name,
int android_bootloader_boot_kernel(unsigned long kernel_address)
{
- ulong comp;
- char kernel_addr_str[12];
- char *fdt_addr = env_get("fdt_addr");
char *kernel_addr_r = env_get("kernel_addr_r");
char *kernel_addr_c = env_get("kernel_addr_c");
-
+ char *fdt_addr = env_get("fdt_addr");
+ char kernel_addr_str[12];
+ char comp_str[32] = {0};
+ ulong comp_type;
const char *comp_name[] = {
- [IH_COMP_NONE] = "",
+ [IH_COMP_NONE] = "IMAGE",
[IH_COMP_GZIP] = "GZIP",
[IH_COMP_BZIP2] = "BZIP2",
[IH_COMP_LZMA] = "LZMA",
@@ -322,17 +326,28 @@ int android_bootloader_boot_kernel(unsigned long kernel_address)
char *bootm_args[] = {
"bootm", kernel_addr_str, kernel_addr_str, fdt_addr, NULL };
- comp = android_image_get_comp((struct andr_img_hdr *)kernel_address);
+ comp_type = env_get_ulong("os_comp", 10, 0);
sprintf(kernel_addr_str, "0x%lx", kernel_address);
- if (comp != IH_COMP_NONE)
- printf("Booting %s kernel at %s(Uncompress to %s) with fdt at %s...\n\n\n",
- comp_name[comp], kernel_addr_c, kernel_addr_r, fdt_addr);
- else
- printf("Booting kernel at %s with fdt at %s...\n\n\n",
- kernel_addr_r, fdt_addr);
+ if (comp_type != IH_COMP_NONE) {
+ if (comp_type == IH_COMP_ZIMAGE &&
+ kernel_addr_r && !kernel_addr_c) {
+ kernel_addr_c = kernel_addr_r;
+ kernel_addr_r = __stringify(CONFIG_SYS_SDRAM_BASE);
+ }
+ snprintf(comp_str, 32, "%s%s%s",
+ "(Uncompress to ", kernel_addr_r, ")");
+ }
+
+ printf("Booting %s kernel at %s%s with fdt at %s...\n\n\n",
+ comp_name[comp_type],
+ comp_type != IH_COMP_NONE ? kernel_addr_c : kernel_addr_r,
+ comp_str, fdt_addr);
- sysmem_dump_check();
+ if (gd->console_evt == CONSOLE_EVT_CTRL_M) {
+ bidram_dump();
+ sysmem_dump();
+ }
do_bootm(NULL, 0, 4, bootm_args);
@@ -574,17 +589,18 @@ static AvbSlotVerifyResult android_slot_verify(char *boot_partname,
memcpy((uint8_t *)load_address,
slot_data[0]->loaded_partitions->data,
slot_data[0]->loaded_partitions->data_size);
-
- /* ... and decrement tries remaining, if applicable. */
- if (!ab_data.slots[slot_index_to_boot].successful_boot &&
- ab_data.slots[slot_index_to_boot].tries_remaining > 0) {
- ab_data.slots[slot_index_to_boot].tries_remaining -= 1;
- }
} else {
slot_set_unbootable(&ab_data.slots[slot_index_to_boot]);
}
out:
+#ifdef CONFIG_ANDROID_AB
+ /* ... and decrement tries remaining, if applicable. */
+ if (!ab_data.slots[slot_index_to_boot].successful_boot &&
+ ab_data.slots[slot_index_to_boot].tries_remaining > 0) {
+ ab_data.slots[slot_index_to_boot].tries_remaining -= 1;
+ }
+#endif
env_update("bootargs", verify_state);
if (save_metadata_if_changed(ops->ab_ops, &ab_data, &ab_data_orig)) {
printf("Can not save metadata\n");
@@ -791,10 +807,8 @@ int android_fdt_overlay_apply(void *fdt_addr)
android_print_contents(hdr);
#endif
- if (android_image_check_header(hdr)) {
- printf("%s: Invalid Android header %s\n", __func__, hdr->magic);
+ if (android_image_check_header(hdr))
return -EINVAL;
- }
/* Check header version */
if (!hdr->header_version) {
@@ -812,7 +826,7 @@ int android_fdt_overlay_apply(void *fdt_addr)
if (sysmem_free((phys_addr_t)fdt_addr))
goto out;
- if (!sysmem_alloc_base("fdt(dtbo)",
+ if (!sysmem_alloc_base(MEMBLK_ID_FDT_DTBO,
(phys_addr_t)fdt_addr,
fdt_size + CONFIG_SYS_FDT_PAD))
goto out;
@@ -878,7 +892,7 @@ bool android_avb_is_enabled(void)
int android_bootloader_boot_flow(struct blk_desc *dev_desc,
unsigned long load_address)
{
- enum android_boot_mode mode;
+ enum android_boot_mode mode = ANDROID_BOOT_MODE_NORMAL;
disk_partition_t misc_part_info;
int part_num;
int ret;
@@ -895,22 +909,23 @@ int android_bootloader_boot_flow(struct blk_desc *dev_desc,
part_num = part_get_info_by_name(dev_desc, ANDROID_PARTITION_MISC,
&misc_part_info);
if (part_num < 0) {
- printf("%s Could not find misc partition\n", __func__);
- return -ENODEV;
- }
-
+ printf("Could not find misc partition\n");
+ } else {
#ifdef CONFIG_ANDROID_KEYMASTER_CA
- /* load attestation key from misc partition. */
- load_attestation_key(dev_desc, &misc_part_info);
+ /* load attestation key from misc partition. */
+ load_attestation_key(dev_desc, &misc_part_info);
#endif
- mode = android_bootloader_load_and_clear_mode(dev_desc, &misc_part_info);
+ mode = android_bootloader_load_and_clear_mode(dev_desc,
+ &misc_part_info);
#ifdef CONFIG_RKIMG_BOOTLOADER
- if (mode == ANDROID_BOOT_MODE_NORMAL) {
- if (rockchip_get_boot_mode() == BOOT_MODE_RECOVERY)
- mode = ANDROID_BOOT_MODE_RECOVERY;
- }
+ if (mode == ANDROID_BOOT_MODE_NORMAL) {
+ if (rockchip_get_boot_mode() == BOOT_MODE_RECOVERY)
+ mode = ANDROID_BOOT_MODE_RECOVERY;
+ }
#endif
+ }
+
printf("ANDROID: reboot reason: \"%s\"\n", android_boot_mode_str(mode));
#ifdef CONFIG_ANDROID_AB
@@ -918,10 +933,48 @@ int android_bootloader_boot_flow(struct blk_desc *dev_desc,
if (rk_avb_get_current_slot(slot_suffix))
return -1;
- if (slot_suffix[0] != '_') {
- printf("There is no bootable slot!\n");
+ AvbOps *ops;
+ AvbABData ab_data;
+ AvbABData ab_data_orig;
+ size_t slot_index_to_boot = 0;
+
+ if (!strncmp(slot_suffix, "_a", 2))
+ slot_index_to_boot = 0;
+ else if (!strncmp(slot_suffix, "_b", 2))
+ slot_index_to_boot = 1;
+ else
+ slot_index_to_boot = 0;
+ ops = avb_ops_user_new();
+ if (ops == NULL) {
+ printf("avb_ops_user_new() failed!\n");
+ return -1;
+ }
+
+ if(load_metadata(ops->ab_ops, &ab_data, &ab_data_orig)) {
+ printf("Can not load metadata\n");
return -1;
}
+
+ /* ... and decrement tries remaining, if applicable. */
+ if (!ab_data.slots[slot_index_to_boot].successful_boot &&
+ ab_data.slots[slot_index_to_boot].tries_remaining > 0) {
+ ab_data.slots[slot_index_to_boot].tries_remaining -= 1;
+ }
+
+ if (save_metadata_if_changed(ops->ab_ops, &ab_data, &ab_data_orig)) {
+ printf("Can not save metadata\n");
+ return -1;
+ }
+
+ if (slot_suffix[0] != '_') {
+ printf("###There is no bootable slot, bring up lastboot!###\n");
+ if (rk_get_lastboot() == 1)
+ memcpy(slot_suffix, "_b", 2);
+ else if(rk_get_lastboot() == 0)
+ memcpy(slot_suffix, "_a", 2);
+ else
+ return -1;
+ }
#endif
switch (mode) {
@@ -930,7 +983,8 @@ int android_bootloader_boot_flow(struct blk_desc *dev_desc,
* "skip_initramfs" to the cmdline to make it ignore the
* recovery initramfs in the boot partition.
*/
-#if defined(CONFIG_ANDROID_AB) && !defined(CONFIG_ANDROID_AVB)
+#if (defined(CONFIG_ANDROID_AB) && !defined(CONFIG_ANDROID_AVB))
+ {
char root_partition[20] = {0};
char guid_buf[UUID_SIZE] = {0};
char root_partuuid[70] = "root=PARTUUID=";
@@ -940,6 +994,7 @@ int android_bootloader_boot_flow(struct blk_desc *dev_desc,
get_partition_unique_uuid(root_partition, guid_buf, UUID_SIZE);
strcat(root_partuuid, guid_buf);
env_update("bootargs", root_partuuid);
+ }
#endif
#ifdef CONFIG_ANDROID_AB
diff --git a/common/attestation_key.c b/common/attestation_key.c
index 0cfe2ef12e..3e3ecb64c9 100644
--- a/common/attestation_key.c
+++ b/common/attestation_key.c
@@ -199,12 +199,13 @@ static bool validate_ca_header(const uint8_t *buf, uint32_t buf_size)
/* write key to security storage. */
static uint32_t write_key(keymaster_algorithm_t key_type,
- const uint8_t *key, uint32_t key_size)
+ unsigned char *key_name,
+ const uint8_t *key, uint32_t key_size)
{
char key_file[STORAGE_ID_LENGTH_MAX] = {0};
- snprintf(key_file, STORAGE_ID_LENGTH_MAX, "%s.%s", ATTESTATION_KEY_FILE,
- get_keyslot_str(key_type));
+ snprintf(key_file, STORAGE_ID_LENGTH_MAX, "%s.%s", key_name,
+ get_keyslot_str(key_type));
write_to_keymaster((uint8_t *)key_file, strlen(key_file),
(uint8_t *)key, key_size);
return 0;
@@ -243,6 +244,7 @@ atap_result load_attestation_key(struct blk_desc *dev_desc,
disk_partition_t *misc_partition)
{
int ret;
+ unsigned char key_name[STORAGE_ID_LENGTH_MAX] = {0};
if (!dev_desc) {
printf("%s: Could not find device\n", __func__);
@@ -325,7 +327,9 @@ atap_result load_attestation_key(struct blk_desc *dev_desc,
return ATAP_RESULT_ERROR_BUF_COPY;
}
/* write rsa private key to security storage*/
- write_key(KM_ALGORITHM_RSA, key.data, key.data_length);
+ memcpy(key_name, ATTESTATION_KEY_PREFIX,
+ sizeof(ATTESTATION_KEY_PREFIX));
+ write_key(KM_ALGORITHM_RSA, key_name, key.data, key.data_length);
/* read rsa cert chain */
atap_certchain certchain;
@@ -359,7 +363,7 @@ atap_result load_attestation_key(struct blk_desc *dev_desc,
}
/* write ec private key to security storage*/
- write_key(KM_ALGORITHM_EC, key.data, key.data_length);
+ write_key(KM_ALGORITHM_EC, key_name, key.data, key.data_length);
/* read ec cert chain */
free_cert_chain(certchain);
@@ -430,12 +434,14 @@ atap_result write_attestation_key_to_secure_storage(uint8_t *received_data,
uint32_t len)
{
unsigned char keybuf[ATTESTATION_DATA_OFFSET] = {0};
+ unsigned char key_name[STORAGE_ID_LENGTH_MAX] = {0};
uint32_t device_id_size = 0;
uint8_t device_id[32] = {0};
uint8_t *key_buf = NULL;
uint32_t algorithm;
uint8_t *key_data;
uint32_t key_data_length = 0;
+
/* skip the tag(4 byte) and the size of key(4 byte) */
memcpy(keybuf, received_data + 8, ATTESTATION_DATA_OFFSET);
key_data = malloc(ATTESTATION_DATA_OFFSET);
@@ -445,11 +451,11 @@ atap_result write_attestation_key_to_secure_storage(uint8_t *received_data,
printf("invalidate device_id_size:%d\n", device_id_size);
return ATAP_RESULT_ERROR_INVALID_DEVICE_ID;
}
-
memcpy(device_id, keybuf + CA_HEADER_LEN + sizeof(uint32_t),
device_id_size);
printf("device_id:%s\n", device_id);
+ memcpy(key_name, ATTESTATION_KEY_FILE, sizeof(ATTESTATION_KEY_FILE));
/* read algorithm(RSA) from keybuf */
key_buf = keybuf + CA_HEADER_LEN + sizeof(uint32_t) + device_id_size;
copy_uint32_from_buf(&key_buf, &algorithm);
@@ -457,7 +463,7 @@ atap_result write_attestation_key_to_secure_storage(uint8_t *received_data,
/* read rsa key and certchain */
read_key_data(&key_buf, key_data, &key_data_length);
printf("write attestation key: RSA\n");
- write_key(KM_ALGORITHM_RSA, key_data, key_data_length);
+ write_key(KM_ALGORITHM_RSA, key_name, key_data, key_data_length);
/* read algorithm(EC) from keybuf */
copy_uint32_from_buf(&key_buf, &algorithm);
@@ -465,7 +471,7 @@ atap_result write_attestation_key_to_secure_storage(uint8_t *received_data,
/* read ec key and certchain */
read_key_data(&key_buf, key_data, &key_data_length);
printf("write attestation key: EC\n");
- write_key(KM_ALGORITHM_EC, key_data, key_data_length);
+ write_key(KM_ALGORITHM_EC, key_name, key_data, key_data_length);
memset(keybuf, 0, sizeof(keybuf));
free(key_data);
diff --git a/common/board_f.c b/common/board_f.c
index 888dc367ae..f898e42edd 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -40,6 +40,7 @@
#include <asm/sections.h>
#include <dm/root.h>
#include <linux/errno.h>
+#include <sysmem.h>
/*
* Pointer to initial global data area
@@ -874,6 +875,9 @@ static const init_fnc_t init_sequence_f[] = {
reserve_stacks,
dram_init_banksize,
show_dram_config,
+#ifdef CONFIG_SYSMEM
+ sysmem_init, /* Validate above reserve memory */
+#endif
#if defined(CONFIG_M68K) || defined(CONFIG_MIPS) || defined(CONFIG_PPC) || \
defined(CONFIG_SH)
setup_board_part1,
diff --git a/common/board_r.c b/common/board_r.c
index f8db94c9af..e49e30c8c2 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -56,6 +56,7 @@
#include <linux/err.h>
#include <efi_loader.h>
#include <sysmem.h>
+#include <bidram.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -711,7 +712,7 @@ __weak int interrupt_debugger_init(void)
return 0;
}
-__weak int dram_initr_banksize(void)
+__weak int board_initr_caches_fixup(void)
{
return 0;
}
@@ -760,15 +761,18 @@ static init_fnc_t init_sequence_r[] = {
* like other regions, otherwise there would be dcache coherence issue
* between firmware and U-Boot.
*/
- dram_initr_banksize,
+ board_initr_caches_fixup,
#if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
initr_unlock_ram_in_cache,
#endif
initr_barrier,
initr_malloc,
+#ifdef CONFIG_BIDRAM
+ bidram_initr,
+#endif
#ifdef CONFIG_SYSMEM
- sysmem_init, /* After malloc setup */
+ sysmem_initr,
#endif
log_init,
initr_bootstage, /* Needs malloc() but has its own timer */
diff --git a/common/boot_rkimg.c b/common/boot_rkimg.c
index 0d48232e3e..49bc241f69 100644
--- a/common/boot_rkimg.c
+++ b/common/boot_rkimg.c
@@ -15,6 +15,8 @@
#include <asm/arch/boot_mode.h>
#include <asm/io.h>
#include <part.h>
+#include <bidram.h>
+#include <console.h>
#include <sysmem.h>
#define TAG_KERNEL 0x4C4E524B
@@ -88,12 +90,10 @@ static void boot_lmb_init(bootm_headers_t *images)
* return the image size on success, and a
* negative value on error.
*/
-static int read_rockchip_image(struct blk_desc *dev_desc,
- disk_partition_t *part_info,
- void *dst)
+int read_rockchip_image(struct blk_desc *dev_desc,
+ disk_partition_t *part_info, void *dst)
{
struct rockchip_image *img;
- const char *name;
int header_len = 8;
int cnt;
int ret;
@@ -101,14 +101,6 @@ static int read_rockchip_image(struct blk_desc *dev_desc,
u32 crc32;
#endif
- if (!strcmp((char *)part_info->name, "kernel"))
- name = "kernel";
- else if (!strcmp((char *)part_info->name, "boot") ||
- !strcmp((char *)part_info->name, "recovery"))
- name = "ramdisk";
- else
- name = NULL;
-
img = memalign(ARCH_DMA_MINALIGN, RK_BLK_SIZE);
if (!img) {
printf("out of memory\n");
@@ -133,7 +125,9 @@ static int read_rockchip_image(struct blk_desc *dev_desc,
* total size = image size + 8 bytes header + 4 bytes crc32
*/
cnt = DIV_ROUND_UP(img->size + 8 + 4, RK_BLK_SIZE);
- if (!sysmem_alloc_base(name, (phys_addr_t)dst, cnt * dev_desc->blksz)) {
+ if (!sysmem_alloc_base_by_name((const char *)part_info->name,
+ (phys_addr_t)dst,
+ cnt * dev_desc->blksz)) {
ret = -ENXIO;
goto err;
}
@@ -208,10 +202,21 @@ int get_bootdev_type(void)
if (!appended && boot_media) {
appended = 1;
- /*
- * 1. androidboot.mode=charger has higher priority, not override;
- * 2. rknand doesn't need "androidboot.mode=";
- */
+
+ /*
+ * The legacy rockchip Android (SDK < 8.1) requires "androidboot.mode="
+ * to be "charger" or boot media which is a rockchip private solution.
+ *
+ * The official Android rule (SDK >= 8.1) is:
+ * "androidboot.mode=normal" or "androidboot.mode=charger".
+ *
+ * Now that this U-Boot is usually working with higher version
+ * Android (SDK >= 8.1), we follow the official rules.
+ *
+ * Common: androidboot.mode=charger has higher priority, don't override;
+ */
+#ifdef CONFIG_RKIMG_ANDROID_BOOTMODE_LEGACY
+ /* rknand doesn't need "androidboot.mode="; */
if (env_exist("bootargs", "androidboot.mode=charger") ||
(type == IF_TYPE_RKNAND) ||
(type == IF_TYPE_SPINAND) ||
@@ -222,6 +227,15 @@ int get_bootdev_type(void)
snprintf(boot_options, sizeof(boot_options),
"storagemedia=%s androidboot.mode=%s",
boot_media, boot_media);
+#else
+ if (env_exist("bootargs", "androidboot.mode=charger"))
+ snprintf(boot_options, sizeof(boot_options),
+ "storagemedia=%s", boot_media);
+ else
+ snprintf(boot_options, sizeof(boot_options),
+ "storagemedia=%s androidboot.mode=normal",
+ boot_media);
+#endif
env_update("bootargs", boot_options);
}
@@ -352,9 +366,14 @@ int rockchip_get_boot_mode(void)
* USB attach will do env_set("reboot_mode", "recovery");
*/
env_reboot_mode = env_get("reboot_mode");
- if (env_reboot_mode && !strcmp(env_reboot_mode, "recovery")) {
- boot_mode = BOOT_MODE_RECOVERY;
- printf("boot mode: recovery\n");
+ if (env_reboot_mode) {
+ if (!strcmp(env_reboot_mode, "recovery")) {
+ boot_mode = BOOT_MODE_RECOVERY;
+ printf("boot mode: recovery\n");
+ } else if (!strcmp(env_reboot_mode, "fastboot")) {
+ boot_mode = BOOT_MODE_BOOTLOADER;
+ printf("boot mode: fastboot\n");
+ }
}
if (boot_mode != -1)
@@ -389,7 +408,6 @@ fallback:
} else {
/* Mode from boot mode register */
reg_boot_mode = readl((void *)CONFIG_ROCKCHIP_BOOT_MODE_REG);
- writel(BOOT_NORMAL, (void *)CONFIG_ROCKCHIP_BOOT_MODE_REG);
switch (reg_boot_mode) {
case BOOT_NORMAL:
@@ -505,7 +523,11 @@ int boot_rockchip_image(struct blk_desc *dev_desc, disk_partition_t *boot_part)
printf("ramdisk @ 0x%08lx (0x%08x)\n", ramdisk_addr_r, ramdisk_size);
fdt_ramdisk_skip_relocation();
- sysmem_dump_check();
+
+ if (gd->console_evt == CONSOLE_EVT_CTRL_M) {
+ bidram_dump();
+ sysmem_dump();
+ }
#if defined(CONFIG_ARM64)
char cmdbuf[64];
diff --git a/common/console.c b/common/console.c
index 399f001f27..4990fdd69a 100644
--- a/common/console.c
+++ b/common/console.c
@@ -412,13 +412,6 @@ int getc(void)
int tstc(void)
{
-/* Don't allow drivers call tstc() to do some "exit" event(maybe enter hush) */
-#if defined(CONFIG_ARCH_ROCKCHIP) && \
- defined(CONFIG_AVB_VBMETA_PUBLIC_KEY_VALIDATE) && \
- defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY <= 0)
- return 0;
-#endif
-
#ifdef CONFIG_DISABLE_CONSOLE
if (gd->flags & GD_FLG_DISABLE_CONSOLE)
return 0;
@@ -601,9 +594,8 @@ static int ctrlc_disabled = 0; /* see disable_ctrl() */
static int ctrlc_was_pressed = 0;
int ctrlc(void)
{
-/* Don't allow drivers call ctrlc() to do some "exit" event(maybe enter hush) */
-#if defined(CONFIG_ARCH_ROCKCHIP) && \
- defined(CONFIG_AVB_VBMETA_PUBLIC_KEY_VALIDATE)
+#if defined(CONFIG_CONSOLE_DISABLE_CTRLC) && \
+ defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY <= 0)
return 0;
#endif
diff --git a/common/fdt_support.c b/common/fdt_support.c
index b096762b1b..28caaf0d51 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -315,12 +315,13 @@ int fdt_chosen(void *fdt)
#ifdef CONFIG_ANDROID_AB
env_update_filter("bootargs", bootargs, "root=");
#else
+ env_update("bootargs", bootargs);
+#endif
/*
* Initrd fixup: remove unused "initrd=0x...,0x...",
* this for compatible with legacy parameter.txt
*/
- env_update_filter("bootargs", bootargs, "initrd=");
-#endif
+ env_delete("bootargs", "initrd=", 0);
}
#endif
}
diff --git a/common/image-android.c b/common/image-android.c
index f37123efaa..048de0f7ea 100644
--- a/common/image-android.c
+++ b/common/image-android.c
@@ -290,7 +290,7 @@ static int android_image_load_separate(struct blk_desc *dev_desc,
size = hdr->kernel_size + hdr->page_size;
blk_start = part->start;
blk_cnt = DIV_ROUND_UP(size, dev_desc->blksz);
- if (!sysmem_alloc_base("kernel",
+ if (!sysmem_alloc_base(MEMBLK_ID_KERNEL,
(phys_addr_t)android_load_address,
blk_cnt * dev_desc->blksz))
return -ENXIO;
@@ -311,7 +311,7 @@ static int android_image_load_separate(struct blk_desc *dev_desc,
size = hdr->page_size + ALIGN(hdr->kernel_size, hdr->page_size);
blk_start = part->start + DIV_ROUND_UP(size, dev_desc->blksz);
blk_cnt = DIV_ROUND_UP(hdr->ramdisk_size, dev_desc->blksz);
- if (!sysmem_alloc_base("ramdisk",
+ if (!sysmem_alloc_base(MEMBLK_ID_RAMDISK,
ramdisk_addr_r,
blk_cnt * dev_desc->blksz))
return -ENXIO;
@@ -347,7 +347,7 @@ static int android_image_load_separate(struct blk_desc *dev_desc,
ALIGN(hdr->ramdisk_size, hdr->page_size);
blk_start = part->start + DIV_ROUND_UP(size, dev_desc->blksz);
blk_cnt = DIV_ROUND_UP(hdr->second_size, dev_desc->blksz);
- if (!sysmem_alloc_base("fdt(AOSP)",
+ if (!sysmem_alloc_base(MEMBLK_ID_FDT_AOSP,
fdt_addr_r,
blk_cnt * dev_desc->blksz +
CONFIG_SYS_FDT_PAD))
@@ -413,15 +413,32 @@ long android_image_load(struct blk_desc *dev_desc,
part_info->blksz - 1) / part_info->blksz;
comp = android_image_parse_kernel_comp(hdr);
/*
- * We should load a compressed kernel Image
- * to high memory
+ * We should load compressed kernel Image to high memory at
+ * address "kernel_addr_c".
*/
if (comp != IH_COMP_NONE) {
- load_address += android_image_get_ksize(hdr) * 3;
- load_address = env_get_ulong("kernel_addr_c", 16, load_address);
- load_address -= hdr->page_size;
- unmap_sysmem(buf);
- buf = map_sysmem(load_address, 0 /* size */);
+ ulong kernel_addr_c;
+
+ env_set_ulong("os_comp", comp);
+ kernel_addr_c = env_get_ulong("kernel_addr_c", 16, 0);
+ if (kernel_addr_c) {
+ load_address = kernel_addr_c - hdr->page_size;
+ unmap_sysmem(buf);
+ buf = map_sysmem(load_address, 0 /* size */);
+ }
+#ifdef CONFIG_ARM64
+ else {
+ printf("Warn: \"kernel_addr_c\" is not defined "
+ "for compressed kernel Image!\n");
+ load_address += android_image_get_ksize(hdr) * 3;
+ load_address = ALIGN(load_address, ARCH_DMA_MINALIGN);
+ env_set_ulong("kernel_addr_c", load_address);
+
+ load_address -= hdr->page_size;
+ unmap_sysmem(buf);
+ buf = map_sysmem(load_address, 0 /* size */);
+ }
+#endif
}
if (blk_cnt * part_info->blksz > max_size) {
@@ -456,7 +473,7 @@ long android_image_load(struct blk_desc *dev_desc,
} else
#endif
{
- if (!sysmem_alloc_base("android",
+ if (!sysmem_alloc_base(MEMBLK_ID_ANDROID,
(phys_addr_t)buf,
blk_cnt * part_info->blksz))
return -ENXIO;
diff --git a/common/image-fdt.c b/common/image-fdt.c
index 6bdbe6c902..6cabd2eeff 100644
--- a/common/image-fdt.c
+++ b/common/image-fdt.c
@@ -88,6 +88,7 @@ void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob)
fdt_addr_t rsv_addr;
/* we needn't repeat do reserve, do_bootm_linux would call this again */
static int rsv_done;
+ const void *prop;
if (fdt_check_header(fdt_blob) != 0 || rsv_done)
return;
@@ -110,6 +111,10 @@ void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob)
for (offset = fdt_first_subnode(fdt_blob, rsv_offset);
offset >= 0;
offset = fdt_next_subnode(fdt_blob, offset)) {
+ prop = fdt_getprop(fdt_blob, offset, "status", NULL);
+ if (prop && !strcmp(prop, "disabled"))
+ continue;
+
rsv_addr = fdtdec_get_addr_size_auto_noparent(fdt_blob, offset,
"reg", 0,
&rsv_size, false);
@@ -137,7 +142,7 @@ int boot_fdt_add_sysmem_rsv_regions(void *fdt_blob)
fdt_addr_t rsv_addr;
static int rsv_done;
char resvname[32];
- int ret;
+ const void *prop;
if (fdt_check_header(fdt_blob) != 0 || rsv_done)
return -EINVAL;
@@ -151,9 +156,8 @@ int boot_fdt_add_sysmem_rsv_regions(void *fdt_blob)
debug(" sysmem: reserving fdt memory region: addr=%llx size=%llx\n",
(unsigned long long)addr, (unsigned long long)size);
sprintf(resvname, "fdt-memory-reserved%d", i);
- ret = sysmem_reserve(resvname, addr, size);
- if (ret)
- return ret;
+ if (!sysmem_fdt_reserve_alloc_base(resvname, addr, size))
+ return -ENOMEM;
}
rsv_offset = fdt_subnode_offset(fdt_blob, 0, "reserved-memory");
@@ -163,6 +167,10 @@ int boot_fdt_add_sysmem_rsv_regions(void *fdt_blob)
for (offset = fdt_first_subnode(fdt_blob, rsv_offset);
offset >= 0;
offset = fdt_next_subnode(fdt_blob, offset)) {
+ prop = fdt_getprop(fdt_blob, offset, "status", NULL);
+ if (prop && !strcmp(prop, "disabled"))
+ continue;
+
rsv_addr = fdtdec_get_addr_size_auto_noparent(fdt_blob, offset,
"reg", 0,
&rsv_size, false);
@@ -171,10 +179,9 @@ int boot_fdt_add_sysmem_rsv_regions(void *fdt_blob)
debug(" sysmem: 'reserved-memory' %s: addr=%llx size=%llx\n",
fdt_get_name(fdt_blob, offset, NULL),
(unsigned long long)rsv_addr, (unsigned long long)rsv_size);
- ret = sysmem_reserve(fdt_get_name(fdt_blob, offset, NULL),
- rsv_addr, rsv_size);
- if (ret)
- return ret;
+ if (!sysmem_fdt_reserve_alloc_base(fdt_get_name(fdt_blob, offset, NULL),
+ rsv_addr, rsv_size))
+ return -ENOMEM;
}
return 0;
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index f97fa03800..d65cbb1ae6 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -197,7 +197,7 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
return -ENOENT;
load_ptr = (load_addr + align_len) & ~align_len;
-#ifdef CONFIG_ROCKCHIP_RK3399
+#if defined(CONFIG_ROCKCHIP_RK3399) || defined(CONFIG_ROCKCHIP_RK3368)
if ((load_ptr & 0xffff0000) == CONFIG_ROCKCHIP_IRAM_START_ADDR)
load_ptr = (ulong)memalign(ARCH_DMA_MINALIGN, len);
#endif
diff --git a/configs/evb-aarch32-rk3308_defconfig b/configs/evb-aarch32-rk3308_defconfig
index f8510b1e49..1937284b35 100644
--- a/configs/evb-aarch32-rk3308_defconfig
+++ b/configs/evb-aarch32-rk3308_defconfig
@@ -51,6 +51,9 @@ CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_GMAC_ROCKCHIP=y
CONFIG_PINCTRL=y
CONFIG_DM_FUEL_GAUGE=y
CONFIG_REGULATOR_PWM=y
diff --git a/configs/evb-px30_defconfig b/configs/evb-px30_defconfig
index 81f1884d78..f69bf0d290 100644
--- a/configs/evb-px30_defconfig
+++ b/configs/evb-px30_defconfig
@@ -47,9 +47,8 @@ CONFIG_CMD_USB=y
CONFIG_CMD_USB_MASS_STORAGE=y
# CONFIG_CMD_ITEST is not set
# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
# CONFIG_CMD_MISC is not set
-# CONFIG_DOS_PARTITION is not set
+# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
CONFIG_RKPARM_PARTITION=y
@@ -69,8 +68,10 @@ CONFIG_RK8XX_PWRKEY=y
CONFIG_ADC_KEY=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
-CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_GMAC_ROCKCHIP=y
CONFIG_PINCTRL=y
CONFIG_DM_FUEL_GAUGE=y
CONFIG_DM_PMIC=y
@@ -128,6 +129,8 @@ CONFIG_VIDEO_BRIDGE_ANALOGIX_ANX6345=y
CONFIG_LCD=y
CONFIG_USE_TINY_PRINTF=y
CONFIG_SPL_TINY_MEMSET=y
+CONFIG_LZ4=y
+CONFIG_LZO=y
CONFIG_ERRNO_STR=y
# CONFIG_EFI_LOADER is not set
CONFIG_OPTEE_CLIENT=y
diff --git a/configs/evb-px5_defconfig b/configs/evb-px5_defconfig
index e9f2c05265..68fbce641d 100644
--- a/configs/evb-px5_defconfig
+++ b/configs/evb-px5_defconfig
@@ -1,28 +1,76 @@
CONFIG_ARM=y
CONFIG_ARCH_ROCKCHIP=y
-CONFIG_SYS_MALLOC_F_LEN=0x1000
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_TPL_MAX_SIZE=32768
CONFIG_ROCKCHIP_RK3368=y
+CONFIG_ROCKCHIP_PX5=y
CONFIG_TARGET_EVB_PX5=y
+CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x40000
+CONFIG_TPL_LIBCOMMON_SUPPORT=y
+CONFIG_TPL_LIBGENERIC_SUPPORT=y
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_PANIC_HANG=y
+CONFIG_SPL_SPI_FLASH_SUPPORT=y
+CONFIG_SPL_SPI_SUPPORT=y
+CONFIG_SPL_STACK_R_ADDR=0x600000
CONFIG_DEFAULT_DEVICE_TREE="rk3368-px5-evb"
CONFIG_DEBUG_UART=y
CONFIG_ANDROID_BOOT_IMAGE=y
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.py"
+CONFIG_BOOTSTAGE=y
+CONFIG_SPL_BOOTSTAGE=y
+CONFIG_BOOTSTAGE_REPORT=y
+CONFIG_BOOTSTAGE_FDT=y
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_ARCH_EARLY_INIT_R=y
+CONFIG_SPL=y
+CONFIG_SPL_BOOTROM_SUPPORT=y
+# CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set
+CONFIG_TPL_SYS_MALLOC_SIMPLE=y
+CONFIG_SPL_STACK_R=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x4000
+CONFIG_SPL_ATF=y
+CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
+CONFIG_TPL=y
+CONFIG_TPL_BOOTROM_SUPPORT=y
# CONFIG_CMD_IMLS is not set
CONFIG_CMD_MMC=y
-CONFIG_CMD_CACHE=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_TPL_OF_CONTROL=y
+CONFIG_OF_LIVE=y
+CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names interrupt-parent"
+CONFIG_TPL_OF_PLATDATA=y
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_TPL_DM=y
CONFIG_REGMAP=y
+CONFIG_SPL_REGMAP=y
+CONFIG_TPL_REGMAP=y
CONFIG_SYSCON=y
+CONFIG_SPL_SYSCON=y
+CONFIG_TPL_SYSCON=y
CONFIG_CLK=y
+CONFIG_SPL_CLK=y
+CONFIG_TPL_CLK=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_PINCTRL=y
+CONFIG_SPL_PINCTRL=y
CONFIG_RAM=y
+CONFIG_SPL_RAM=y
+CONFIG_TPL_RAM=y
CONFIG_DM_RESET=y
CONFIG_DEBUG_UART_BASE=0xFF1c0000
CONFIG_DEBUG_UART_CLOCK=24000000
CONFIG_DEBUG_UART_SHIFT=2
-CONFIG_DEBUG_UART_ANNOUNCE=y
CONFIG_DEBUG_UART_SKIP_INIT=y
CONFIG_SYSRESET=y
+CONFIG_USE_TINY_PRINTF=y
+CONFIG_TPL_TINY_MEMSET=y
+CONFIG_SPL_TINY_MEMSET=y
CONFIG_ERRNO_STR=y
diff --git a/configs/evb-rk3036_defconfig b/configs/evb-rk3036_defconfig
index 2e8fcf21ad..9166b2725f 100644
--- a/configs/evb-rk3036_defconfig
+++ b/configs/evb-rk3036_defconfig
@@ -30,6 +30,7 @@ CONFIG_SPL_OPTEE_SUPPORT=y
CONFIG_SPL_OPTEE=y
CONFIG_TPL_TINY_FRAMEWORK=y
CONFIG_TPL_SERIAL_SUPPORT=y
+CONFIG_FASTBOOT_BUF_ADDR=0x60800800
CONFIG_FASTBOOT_BUF_SIZE=0x04000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
diff --git a/configs/evb-rk3229_defconfig b/configs/evb-rk3229_defconfig
index a6c05c99da..99a232f563 100644
--- a/configs/evb-rk3229_defconfig
+++ b/configs/evb-rk3229_defconfig
@@ -30,6 +30,7 @@ CONFIG_ANDROID_BOOTLOADER=y
CONFIG_SPL_STACK_R=y
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
CONFIG_SPL_OPTEE=y
+CONFIG_FASTBOOT_BUF_ADDR=0x60800800
CONFIG_FASTBOOT_BUF_SIZE=0x04000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
diff --git a/configs/evb-rk3288-rk1608_defconfig b/configs/evb-rk3288-rk1608_defconfig
index 4c65113ff0..2dfa1e8c40 100644
--- a/configs/evb-rk3288-rk1608_defconfig
+++ b/configs/evb-rk3288-rk1608_defconfig
@@ -14,6 +14,8 @@ CONFIG_SPL_STACK_R=y
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
+CONFIG_FASTBOOT_BUF_ADDR=0x800800
+CONFIG_FASTBOOT_BUF_SIZE=0x4000000
# CONFIG_CMD_IMLS is not set
CONFIG_CMD_GPIO=y
CONFIG_CMD_GPT=y
diff --git a/configs/evb-rk3308_defconfig b/configs/evb-rk3308_defconfig
index 48af622e47..979823ec75 100644
--- a/configs/evb-rk3308_defconfig
+++ b/configs/evb-rk3308_defconfig
@@ -49,6 +49,9 @@ CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_GMAC_ROCKCHIP=y
CONFIG_PINCTRL=y
CONFIG_DM_FUEL_GAUGE=y
CONFIG_REGULATOR_PWM=y
diff --git a/configs/evb-rk3326_defconfig b/configs/evb-rk3326_defconfig
index e9a9db9e24..27a9790679 100644
--- a/configs/evb-rk3326_defconfig
+++ b/configs/evb-rk3326_defconfig
@@ -49,7 +49,7 @@ CONFIG_CMD_USB_MASS_STORAGE=y
# CONFIG_CMD_ITEST is not set
# CONFIG_CMD_SETEXPR is not set
# CONFIG_CMD_MISC is not set
-# CONFIG_DOS_PARTITION is not set
+# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
CONFIG_RKPARM_PARTITION=y
@@ -69,7 +69,6 @@ CONFIG_RK8XX_PWRKEY=y
CONFIG_ADC_KEY=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
-CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_PINCTRL=y
CONFIG_DM_FUEL_GAUGE=y
diff --git a/configs/evb-rk3328_defconfig b/configs/evb-rk3328_defconfig
index 7bc65c73e5..77d757afae 100644
--- a/configs/evb-rk3328_defconfig
+++ b/configs/evb-rk3328_defconfig
@@ -3,8 +3,9 @@ CONFIG_ARCH_ROCKCHIP=y
CONFIG_SPL_LIBCOMMON_SUPPORT=y
CONFIG_SPL_LIBGENERIC_SUPPORT=y
CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.py"
CONFIG_ROCKCHIP_RK3328=y
-CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0
+CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x40000
CONFIG_TPL_LIBCOMMON_SUPPORT=y
CONFIG_TPL_LIBGENERIC_SUPPORT=y
CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
@@ -16,7 +17,6 @@ CONFIG_TPL_SYS_MALLOC_F_LEN=0x600
CONFIG_FIT=y
CONFIG_FIT_VERBOSE=y
CONFIG_SPL_LOAD_FIT=y
-CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.py"
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_TPL_SYS_MALLOC_SIMPLE=y
CONFIG_SPL_STACK_R=y
@@ -25,6 +25,7 @@ CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
CONFIG_TPL_BOOTROM_SUPPORT=y
CONFIG_TPL_DRIVERS_MISC_SUPPORT=y
CONFIG_FASTBOOT_BUF_ADDR=0x800800
+CONFIG_FASTBOOT_BUF_SIZE=0x4000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=1
CONFIG_CMD_BOOTZ=y
@@ -39,8 +40,8 @@ CONFIG_TPL_OF_CONTROL=y
CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
CONFIG_TPL_OF_PLATDATA=y
CONFIG_ENV_IS_IN_MMC=y
-CONFIG_TPL_DM=y
CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_TPL_DM=y
CONFIG_REGMAP=y
CONFIG_SPL_REGMAP=y
CONFIG_TPL_REGMAP=y
@@ -54,12 +55,11 @@ CONFIG_SYS_I2C_ROCKCHIP=y
CONFIG_DM_KEY=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
-CONFIG_PHY=y
-CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_DM_ETH=y
CONFIG_ETH_DESIGNWARE=y
CONFIG_GMAC_ROCKCHIP=y
CONFIG_PHY=y
+CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_PINCTRL=y
CONFIG_DM_PMIC=y
CONFIG_PMIC_RK8XX=y
diff --git a/configs/evb-rk3399_defconfig b/configs/evb-rk3399_defconfig
index 2d3df130a2..c431b34bf8 100644
--- a/configs/evb-rk3399_defconfig
+++ b/configs/evb-rk3399_defconfig
@@ -20,7 +20,7 @@ CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000
CONFIG_SPL_ATF=y
CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
CONFIG_FASTBOOT_BUF_ADDR=0x00800800
-CONFIG_FASTBOOT_BUF_SIZE=0x08000000
+CONFIG_FASTBOOT_BUF_SIZE=0x04000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
CONFIG_CMD_BOOTZ=y
diff --git a/configs/evb-rv1108_defconfig b/configs/evb-rv1108_defconfig
index 4afae952d0..c605c33a13 100644
--- a/configs/evb-rv1108_defconfig
+++ b/configs/evb-rv1108_defconfig
@@ -2,6 +2,9 @@ CONFIG_ARM=y
# CONFIG_SPL_USE_ARCH_MEMCPY is not set
# CONFIG_SPL_USE_ARCH_MEMSET is not set
CONFIG_ARCH_ROCKCHIP=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
CONFIG_ROCKCHIP_RV1108=y
CONFIG_SPL_ROCKCHIP_BACK_TO_BROM=y
CONFIG_RKIMG_BOOTLOADER=y
@@ -15,10 +18,11 @@ CONFIG_DEBUG_UART=y
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_ANDROID_BOOTLOADER=y
CONFIG_SPL_STACK_R=y
+CONFIG_PANIC_HANG=y
CONFIG_TPL_TINY_FRAMEWORK=y
CONFIG_TPL_SERIAL_SUPPORT=y
CONFIG_FASTBOOT_BUF_ADDR=0x62000000
-CONFIG_FASTBOOT_BUF_SIZE=0x08000000
+CONFIG_FASTBOOT_BUF_SIZE=0x04000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=1
# CONFIG_CMD_IMLS is not set
@@ -34,11 +38,12 @@ CONFIG_CMD_TIME=y
CONFIG_SPL_OF_CONTROL=y
CONFIG_TPL_OF_CONTROL=y
CONFIG_OF_LIVE=y
-CONFIG_SPL_OF_PLATDATA=y
CONFIG_TPL_OF_PLATDATA=y
CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_REGMAP=y
+CONFIG_SPL_REGMAP=y
CONFIG_SYSCON=y
+CONFIG_SPL_SYSCON=y
CONFIG_CLK=y
CONFIG_ROCKCHIP_GPIO=y
CONFIG_SYS_I2C_ROCKCHIP=y
diff --git a/configs/px30_defconfig b/configs/px30_defconfig
index 70f39c138d..43449a49b3 100644
--- a/configs/px30_defconfig
+++ b/configs/px30_defconfig
@@ -49,9 +49,8 @@ CONFIG_CMD_USB=y
CONFIG_CMD_USB_MASS_STORAGE=y
# CONFIG_CMD_ITEST is not set
# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
# CONFIG_CMD_MISC is not set
-# CONFIG_DOS_PARTITION is not set
+# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
CONFIG_RKPARM_PARTITION=y
@@ -71,6 +70,9 @@ CONFIG_RK8XX_PWRKEY=y
CONFIG_ADC_KEY=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_GMAC_ROCKCHIP=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_PINCTRL=y
CONFIG_DM_FUEL_GAUGE=y
@@ -129,6 +131,8 @@ CONFIG_VIDEO_BRIDGE_ANALOGIX_ANX6345=y
CONFIG_LCD=y
CONFIG_USE_TINY_PRINTF=y
CONFIG_SPL_TINY_MEMSET=y
+CONFIG_LZ4=y
+CONFIG_LZO=y
CONFIG_ERRNO_STR=y
CONFIG_OF_LIBFDT_OVERLAY=y
# CONFIG_EFI_LOADER is not set
diff --git a/configs/rk1808_defconfig b/configs/rk1808_defconfig
index 8ffec5633e..834776a53d 100644
--- a/configs/rk1808_defconfig
+++ b/configs/rk1808_defconfig
@@ -16,6 +16,7 @@ CONFIG_SYS_CONSOLE_INFO_QUIET=y
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_ANDROID_BOOTLOADER=y
CONFIG_FASTBOOT_BUF_ADDR=0x00800800
+CONFIG_FASTBOOT_BUF_SIZE=0x04000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
# CONFIG_CMD_BOOTD is not set
@@ -37,14 +38,12 @@ CONFIG_CMD_USB=y
CONFIG_CMD_USB_MASS_STORAGE=y
# CONFIG_CMD_ITEST is not set
# CONFIG_CMD_SETEXPR is not set
-# CONFIG_CMD_NET is not set
# CONFIG_CMD_MISC is not set
# CONFIG_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_RKPARM_PARTITION=y
CONFIG_OF_LIVE=y
CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
-CONFIG_NET=y
CONFIG_REGMAP=y
CONFIG_SYSCON=y
CONFIG_CLK=y
@@ -56,6 +55,9 @@ CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_GMAC_ROCKCHIP=y
CONFIG_PINCTRL=y
CONFIG_DM_FUEL_GAUGE=y
CONFIG_DM_PMIC=y
diff --git a/configs/rk3036_defconfig b/configs/rk3036_defconfig
index 62e45aa81b..acb901c273 100644
--- a/configs/rk3036_defconfig
+++ b/configs/rk3036_defconfig
@@ -32,6 +32,7 @@ CONFIG_SPL_OPTEE_SUPPORT=y
CONFIG_SPL_OPTEE=y
CONFIG_TPL_TINY_FRAMEWORK=y
CONFIG_TPL_SERIAL_SUPPORT=y
+CONFIG_FASTBOOT_BUF_ADDR=0x60800800
CONFIG_FASTBOOT_BUF_SIZE=0x04000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
diff --git a/configs/rk3126_defconfig b/configs/rk3126_defconfig
index 447b70876f..669761bf7a 100644
--- a/configs/rk3126_defconfig
+++ b/configs/rk3126_defconfig
@@ -36,7 +36,6 @@ CONFIG_CMD_USB_MASS_STORAGE=y
# CONFIG_CMD_SETEXPR is not set
CONFIG_CMD_BMP=y
# CONFIG_CMD_MISC is not set
-# CONFIG_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
CONFIG_RKPARM_PARTITION=y
@@ -54,7 +53,6 @@ CONFIG_GPIO_KEY=y
CONFIG_RK_KEY=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
-CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_PINCTRL=y
CONFIG_DM_FUEL_GAUGE=y
diff --git a/configs/rk3128x_defconfig b/configs/rk3128x_defconfig
index 46c4f5da7b..511babf891 100644
--- a/configs/rk3128x_defconfig
+++ b/configs/rk3128x_defconfig
@@ -32,6 +32,7 @@ CONFIG_SPL_STACK_R=y
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
CONFIG_SPL_OPTEE=y
CONFIG_TPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_FASTBOOT_BUF_ADDR=0x60800800
CONFIG_FASTBOOT_BUF_SIZE=0x04000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
diff --git a/configs/rk322x_defconfig b/configs/rk322x_defconfig
index cc18398c46..fd3f6306e0 100644
--- a/configs/rk322x_defconfig
+++ b/configs/rk322x_defconfig
@@ -31,6 +31,7 @@ CONFIG_SPL_STACK_R=y
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
CONFIG_SPL_OPTEE=y
CONFIG_TPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_FASTBOOT_BUF_ADDR=0x60800800
CONFIG_FASTBOOT_BUF_SIZE=0x04000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
@@ -52,7 +53,7 @@ CONFIG_CMD_USB_MASS_STORAGE=y
# CONFIG_CMD_ITEST is not set
# CONFIG_CMD_SETEXPR is not set
# CONFIG_CMD_MISC is not set
-# CONFIG_DOS_PARTITION is not set
+# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
CONFIG_RKPARM_PARTITION=y
@@ -82,7 +83,6 @@ CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_DM_ETH=y
CONFIG_ETH_DESIGNWARE=y
CONFIG_GMAC_ROCKCHIP=y
-CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_PINCTRL=y
CONFIG_DM_PMIC=y
diff --git a/configs/rk3288_defconfig b/configs/rk3288_defconfig
index e9e178100b..34c0705cfc 100644
--- a/configs/rk3288_defconfig
+++ b/configs/rk3288_defconfig
@@ -13,11 +13,15 @@ CONFIG_BOOTDELAY=0
CONFIG_SYS_CONSOLE_INFO_QUIET=y
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_ANDROID_BOOTLOADER=y
+CONFIG_ANDROID_AVB=y
CONFIG_SPL_STACK_R=y
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
+CONFIG_FASTBOOT_BUF_ADDR=0x800800
+CONFIG_FASTBOOT_BUF_SIZE=0x4000000
# CONFIG_CMD_BOOTD is not set
+CONFIG_CMD_DTIMG=y
# CONFIG_CMD_ELF is not set
# CONFIG_CMD_IMI is not set
# CONFIG_CMD_IMLS is not set
@@ -36,7 +40,7 @@ CONFIG_CMD_USB=y
# CONFIG_CMD_MISC is not set
CONFIG_CMD_PMIC=y
CONFIG_CMD_REGULATOR=y
-# CONFIG_DOS_PARTITION is not set
+# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
# CONFIG_SPL_EFI_PARTITION is not set
@@ -102,15 +106,14 @@ CONFIG_LCD=y
CONFIG_USE_TINY_PRINTF=y
CONFIG_CMD_DHRYSTONE=y
CONFIG_ERRNO_STR=y
+CONFIG_OF_LIBFDT_OVERLAY=y
# CONFIG_EFI_LOADER is not set
-CONFIG_TEST_ROCKCHIP=y
-CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
-CONFIG_OPTEE_CLIENT=y
-CONFIG_OPTEE_V1=y
-CONFIG_CMD_MMC=y
-CONFIG_ANDROID_AVB=y
CONFIG_AVB_LIBAVB=y
CONFIG_AVB_LIBAVB_AB=y
CONFIG_AVB_LIBAVB_ATX=y
CONFIG_AVB_LIBAVB_USER=y
CONFIG_RK_AVB_LIBAVB_USER=y
+CONFIG_OPTEE_CLIENT=y
+CONFIG_OPTEE_V1=y
+CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
+CONFIG_TEST_ROCKCHIP=y
diff --git a/configs/rk3308-aarch32_defconfig b/configs/rk3308-aarch32_defconfig
index c1a2d8def6..ffa565e3d6 100644
--- a/configs/rk3308-aarch32_defconfig
+++ b/configs/rk3308-aarch32_defconfig
@@ -37,7 +37,6 @@ CONFIG_CMD_MMC=y
# CONFIG_CMD_LED is not set
# CONFIG_CMD_MISC is not set
CONFIG_CMD_PMIC=y
-# CONFIG_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
CONFIG_OF_LIVE=y
@@ -56,6 +55,9 @@ CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_GMAC_ROCKCHIP=y
CONFIG_PINCTRL=y
CONFIG_DM_FUEL_GAUGE=y
CONFIG_POWER_FG_RK816=y
diff --git a/configs/rk3308_defconfig b/configs/rk3308_defconfig
index 5be3f455a3..84b02619d3 100644
--- a/configs/rk3308_defconfig
+++ b/configs/rk3308_defconfig
@@ -36,7 +36,6 @@ CONFIG_CMD_MMC=y
# CONFIG_CMD_LED is not set
# CONFIG_CMD_MISC is not set
CONFIG_CMD_PMIC=y
-# CONFIG_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
CONFIG_OF_LIVE=y
@@ -55,6 +54,9 @@ CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_GMAC_ROCKCHIP=y
CONFIG_PINCTRL=y
CONFIG_DM_FUEL_GAUGE=y
CONFIG_POWER_FG_RK816=y
diff --git a/configs/rk3326_defconfig b/configs/rk3326_defconfig
index ab40b9e0e4..698f4e50a5 100644
--- a/configs/rk3326_defconfig
+++ b/configs/rk3326_defconfig
@@ -52,7 +52,7 @@ CONFIG_CMD_USB_MASS_STORAGE=y
# CONFIG_CMD_ITEST is not set
# CONFIG_CMD_SETEXPR is not set
# CONFIG_CMD_MISC is not set
-# CONFIG_DOS_PARTITION is not set
+# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
CONFIG_RKPARM_PARTITION=y
@@ -72,7 +72,6 @@ CONFIG_RK8XX_PWRKEY=y
CONFIG_ADC_KEY=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
-CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_PINCTRL=y
CONFIG_DM_FUEL_GAUGE=y
@@ -122,6 +121,8 @@ CONFIG_DRM_ROCKCHIP_RGB=y
CONFIG_LCD=y
CONFIG_USE_TINY_PRINTF=y
CONFIG_SPL_TINY_MEMSET=y
+CONFIG_LZ4=y
+CONFIG_LZO=y
CONFIG_ERRNO_STR=y
CONFIG_OF_LIBFDT_OVERLAY=y
# CONFIG_EFI_LOADER is not set
diff --git a/configs/rk3328_defconfig b/configs/rk3328_defconfig
index 998e53f9f9..8b01c1f96b 100644
--- a/configs/rk3328_defconfig
+++ b/configs/rk3328_defconfig
@@ -5,7 +5,7 @@ CONFIG_SPL_LIBGENERIC_SUPPORT=y
CONFIG_SYS_MALLOC_F_LEN=0x2000
CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.py"
CONFIG_ROCKCHIP_RK3328=y
-CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0
+CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x40000
CONFIG_RKIMG_BOOTLOADER=y
CONFIG_ROCKCHIP_VENDOR_PARTITION=y
CONFIG_TPL_LIBCOMMON_SUPPORT=y
@@ -28,12 +28,11 @@ CONFIG_SPL_STACK_R=y
CONFIG_SPL_ATF=y
CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
CONFIG_TPL_BOOTROM_SUPPORT=y
-CONFIG_TPL_DRIVERS_MISC_SUPPORT=y
CONFIG_FASTBOOT_BUF_ADDR=0x800800
+CONFIG_FASTBOOT_BUF_SIZE=0x4000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
# CONFIG_CMD_BDI is not set
-CONFIG_CMD_CONSOLE=y
# CONFIG_CMD_BOOTD is not set
CONFIG_CMD_BOOTZ=y
# CONFIG_CMD_ELF is not set
@@ -81,7 +80,6 @@ CONFIG_MISC=y
CONFIG_ROCKCHIP_EFUSE=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
-CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_PINCTRL=y
CONFIG_DM_PMIC=y
@@ -118,7 +116,9 @@ CONFIG_ROCKCHIP_DRM_TVE=y
CONFIG_LCD=y
# CONFIG_IRQ is not set
CONFIG_USE_TINY_PRINTF=y
+CONFIG_PANIC_HANG=y
CONFIG_SPL_TINY_MEMSET=y
+CONFIG_TPL_TINY_MEMSET=y
CONFIG_ERRNO_STR=y
# CONFIG_EFI_LOADER is not set
CONFIG_AVB_LIBAVB=y
diff --git a/configs/rk3368_defconfig b/configs/rk3368_defconfig
index 67b7d03ae7..9dcdda9185 100644
--- a/configs/rk3368_defconfig
+++ b/configs/rk3368_defconfig
@@ -12,6 +12,7 @@ CONFIG_SYS_CONSOLE_INFO_QUIET=y
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_ARCH_EARLY_INIT_R=y
CONFIG_ANDROID_BOOTLOADER=y
+CONFIG_ANDROID_AVB=y
CONFIG_FASTBOOT_BUF_ADDR=0x800800
CONFIG_FASTBOOT_BUF_SIZE=0x04000000
CONFIG_FASTBOOT_FLASH=y
@@ -38,7 +39,6 @@ CONFIG_CMD_USB_MASS_STORAGE=y
# CONFIG_CMD_SETEXPR is not set
# CONFIG_CMD_NET is not set
# CONFIG_CMD_MISC is not set
-# CONFIG_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_RKPARM_PARTITION=y
CONFIG_OF_LIVE=y
@@ -55,7 +55,6 @@ CONFIG_GPIO_KEY=y
CONFIG_RK_KEY=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
-CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_PINCTRL=y
CONFIG_DM_FUEL_GAUGE=y
@@ -100,13 +99,12 @@ CONFIG_USE_TINY_PRINTF=y
CONFIG_ERRNO_STR=y
CONFIG_OF_LIBFDT_OVERLAY=y
# CONFIG_EFI_LOADER is not set
-CONFIG_OPTEE_CLIENT=y
-CONFIG_OPTEE_V1=y
-CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
-CONFIG_ANDROID_AVB=y
CONFIG_AVB_LIBAVB=y
CONFIG_AVB_LIBAVB_AB=y
CONFIG_AVB_LIBAVB_ATX=y
CONFIG_AVB_LIBAVB_USER=y
CONFIG_RK_AVB_LIBAVB_USER=y
+CONFIG_OPTEE_CLIENT=y
+CONFIG_OPTEE_V1=y
+CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y
CONFIG_TEST_ROCKCHIP=y
diff --git a/configs/rk3399_defconfig b/configs/rk3399_defconfig
index af958d7861..ae4d35572b 100755
--- a/configs/rk3399_defconfig
+++ b/configs/rk3399_defconfig
@@ -23,7 +23,7 @@ CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000
CONFIG_SPL_ATF=y
CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
CONFIG_FASTBOOT_BUF_ADDR=0x00800800
-CONFIG_FASTBOOT_BUF_SIZE=0x08000000
+CONFIG_FASTBOOT_BUF_SIZE=0x04000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
# CONFIG_CMD_BOOTD is not set
@@ -47,7 +47,7 @@ CONFIG_CMD_USB=y
# CONFIG_CMD_ITEST is not set
# CONFIG_CMD_SETEXPR is not set
# CONFIG_CMD_MISC is not set
-# CONFIG_DOS_PARTITION is not set
+# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
CONFIG_RKPARM_PARTITION=y
@@ -76,7 +76,6 @@ CONFIG_MMC_SDHCI_ROCKCHIP=y
CONFIG_DM_ETH=y
CONFIG_ETH_DESIGNWARE=y
CONFIG_GMAC_ROCKCHIP=y
-CONFIG_PHY=y
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
CONFIG_PINCTRL=y
CONFIG_SPL_PINCTRL=y
diff --git a/configs/rk3399pro-npu_defconfig b/configs/rk3399pro-npu_defconfig
index 7b59efdf56..bcc3cd3703 100644
--- a/configs/rk3399pro-npu_defconfig
+++ b/configs/rk3399pro-npu_defconfig
@@ -53,10 +53,11 @@ CONFIG_ROCKCHIP_GPIO=y
CONFIG_SYS_I2C_ROCKCHIP=y
# CONFIG_MMC is not set
CONFIG_PINCTRL=y
+CONFIG_REGULATOR_FAN53555=y
CONFIG_REGULATOR_PWM=y
CONFIG_RAM=y
CONFIG_DM_RAMDISK=y
-CONFIG_RAMDISK_READONLY=y
+CONFIG_RAMDISK_RO=y
CONFIG_DM_RESET=y
CONFIG_BAUDRATE=1500000
CONFIG_DEBUG_UART_BASE=0xff550000
diff --git a/configs/rk3399pro_defconfig b/configs/rk3399pro_defconfig
index 778f0964b5..95a3dc9559 100644
--- a/configs/rk3399pro_defconfig
+++ b/configs/rk3399pro_defconfig
@@ -23,7 +23,7 @@ CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000
CONFIG_SPL_ATF=y
CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y
CONFIG_FASTBOOT_BUF_ADDR=0x00800800
-CONFIG_FASTBOOT_BUF_SIZE=0x08000000
+CONFIG_FASTBOOT_BUF_SIZE=0x04000000
CONFIG_FASTBOOT_FLASH=y
CONFIG_FASTBOOT_FLASH_MMC_DEV=0
# CONFIG_CMD_BOOTD is not set
@@ -48,7 +48,7 @@ CONFIG_CMD_USB_MASS_STORAGE=y
# CONFIG_CMD_ITEST is not set
# CONFIG_CMD_SETEXPR is not set
# CONFIG_CMD_MISC is not set
-# CONFIG_DOS_PARTITION is not set
+# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_ISO_PARTITION is not set
CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64
CONFIG_RKPARM_PARTITION=y
diff --git a/disk/part_rkparm.c b/disk/part_rkparm.c
index 156608cf8b..6d9221f6b6 100644
--- a/disk/part_rkparm.c
+++ b/disk/part_rkparm.c
@@ -277,7 +277,7 @@ static int part_get_info_rkparm(struct blk_desc *dev_desc, int idx,
}
info->start = p->start;
- info->size = p->size << 9;
+ info->size = p->size;
info->blksz = dev_desc->blksz;
sprintf((char *)info->name, "%s", p->name);
diff --git a/drivers/clk/rockchip/clk_px30.c b/drivers/clk/rockchip/clk_px30.c
index b36f16bc3e..e3c73932f5 100644
--- a/drivers/clk/rockchip/clk_px30.c
+++ b/drivers/clk/rockchip/clk_px30.c
@@ -855,6 +855,7 @@ static ulong px30_bus_get_clk(struct px30_clk_priv *priv, ulong clk_id)
parent = priv->gpll_hz;
break;
case PCLK_BUS_PRE:
+ case PCLK_WDT_NS:
parent = px30_bus_get_clk(priv, ACLK_BUS_PRE);
con = readl(&cru->clksel_con[24]);
div = (con & BUS_PCLK_DIV_MASK) >> BUS_PCLK_DIV_SHIFT;
@@ -1054,6 +1055,50 @@ static ulong px30_i2s1_mclk_set_clk(struct px30_clk_priv *priv, ulong clk_id,
return px30_i2s1_mclk_get_clk(priv, clk_id);
}
+
+static ulong px30_mac_set_clk(struct clk *clk, uint hz)
+{
+ struct px30_clk_priv *priv = dev_get_priv(clk->dev);
+ struct px30_cru *cru = priv->cru;
+ u32 con = readl(&cru->clksel_con[22]);
+ ulong pll_rate;
+ u8 div;
+
+ if ((con >> GMAC_PLL_SEL_SHIFT) & GMAC_PLL_SEL_CPLL)
+ pll_rate = px30_clk_get_pll_rate(priv, CPLL);
+ else if ((con >> GMAC_PLL_SEL_SHIFT) & GMAC_PLL_SEL_NPLL)
+ pll_rate = px30_clk_get_pll_rate(priv, NPLL);
+ else
+ pll_rate = priv->gpll_hz;
+
+ /*default set 50MHZ for gmac*/
+ if (!hz)
+ hz = 50000000;
+
+ div = DIV_ROUND_UP(pll_rate, hz) - 1;
+ assert(div < 32);
+ rk_clrsetreg(&cru->clksel_con[22], CLK_GMAC_DIV_MASK,
+ div << CLK_GMAC_DIV_SHIFT);
+
+ return DIV_TO_RATE(pll_rate, div);
+}
+
+static int px30_mac_set_speed_clk(struct clk *clk, uint hz)
+{
+ struct px30_clk_priv *priv = dev_get_priv(clk->dev);
+ struct px30_cru *cru = priv->cru;
+
+ if (hz != 2500000 && hz != 25000000) {
+ debug("Unsupported mac speed:%d\n", hz);
+ return -EINVAL;
+ }
+
+ rk_clrsetreg(&cru->clksel_con[23], RMII_CLK_SEL_MASK,
+ ((hz == 2500000) ? 0 : 1) << RMII_CLK_SEL_SHIFT);
+
+ return 0;
+}
+
#endif
static int px30_clk_get_gpll_rate(ulong *rate)
@@ -1202,6 +1247,7 @@ static ulong px30_clk_get_rate(struct clk *clk)
case ACLK_BUS_PRE:
case HCLK_BUS_PRE:
case PCLK_BUS_PRE:
+ case PCLK_WDT_NS:
rate = px30_bus_get_clk(priv, clk->id);
break;
case ACLK_PERI_PRE:
@@ -1293,6 +1339,13 @@ static ulong px30_clk_set_rate(struct clk *clk, ulong rate)
case SCLK_I2S1_OUT:
ret = px30_i2s1_mclk_set_clk(priv, clk->id, rate);
break;
+ case SCLK_GMAC:
+ case SCLK_GMAC_SRC:
+ ret = px30_mac_set_clk(clk, rate);
+ break;
+ case SCLK_GMAC_RMII:
+ ret = px30_mac_set_speed_clk(clk, rate);
+ break;
#endif
default:
return -ENOENT;
@@ -1424,11 +1477,43 @@ static int px30_clk_set_phase(struct clk *clk, int degrees)
return ret;
}
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+static int px30_gmac_set_parent(struct clk *clk, struct clk *parent)
+{
+ struct px30_clk_priv *priv = dev_get_priv(clk->dev);
+ struct px30_cru *cru = priv->cru;
+
+ if (parent->id == SCLK_GMAC_SRC) {
+ debug("%s: switching GAMC to SCLK_GMAC_SRC\n", __func__);
+ rk_clrsetreg(&cru->clksel_con[23], RMII_EXTCLK_SEL_MASK,
+ RMII_EXTCLK_SEL_INT << RMII_EXTCLK_SEL_SHIFT);
+ } else {
+ debug("%s: switching GMAC to external clock\n", __func__);
+ rk_clrsetreg(&cru->clksel_con[23], RMII_EXTCLK_SEL_MASK,
+ RMII_EXTCLK_SEL_EXT << RMII_EXTCLK_SEL_SHIFT);
+ }
+ return 0;
+}
+
+static int px30_clk_set_parent(struct clk *clk, struct clk *parent)
+{
+ switch (clk->id) {
+ case SCLK_GMAC:
+ return px30_gmac_set_parent(clk, parent);
+ default:
+ return -ENOENT;
+ }
+}
+#endif
+
static struct clk_ops px30_clk_ops = {
.get_rate = px30_clk_get_rate,
.set_rate = px30_clk_set_rate,
.get_phase = px30_clk_get_phase,
.set_phase = px30_clk_set_phase,
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+ .set_parent = px30_clk_set_parent,
+#endif
};
static int px30_clk_probe(struct udevice *dev)
diff --git a/drivers/clk/rockchip/clk_rk1808.c b/drivers/clk/rockchip/clk_rk1808.c
index 9639065fc4..10ff010438 100644
--- a/drivers/clk/rockchip/clk_rk1808.c
+++ b/drivers/clk/rockchip/clk_rk1808.c
@@ -564,6 +564,67 @@ static ulong rk1808_vop_set_clk(struct rk1808_clk_priv *priv,
return rk1808_vop_get_clk(priv, clk_id);
}
+
+static ulong rk1808_mac_set_clk(struct clk *clk, uint hz)
+{
+ struct rk1808_clk_priv *priv = dev_get_priv(clk->dev);
+ struct rk1808_cru *cru = priv->cru;
+ u32 con = readl(&cru->clksel_con[26]);
+ ulong pll_rate;
+ u8 div;
+
+ if ((con >> GMAC_PLL_SEL_SHIFT) & GMAC_PLL_SEL_NPLL)
+ pll_rate = rockchip_pll_get_rate(&rk1808_pll_clks[NPLL],
+ priv->cru, NPLL);
+ else if ((con >> GMAC_PLL_SEL_SHIFT) & GMAC_PLL_SEL_PPLL)
+ pll_rate = rockchip_pll_get_rate(&rk1808_pll_clks[PPLL],
+ priv->cru, PPLL);
+ else
+ pll_rate = rockchip_pll_get_rate(&rk1808_pll_clks[CPLL],
+ priv->cru, CPLL);
+
+ /*default set 50MHZ for gmac*/
+ if (!hz)
+ hz = 50000000;
+
+ div = DIV_ROUND_UP(pll_rate, hz) - 1;
+ assert(div < 32);
+ rk_clrsetreg(&cru->clksel_con[26], CLK_GMAC_DIV_MASK,
+ div << CLK_GMAC_DIV_SHIFT);
+
+ return DIV_TO_RATE(pll_rate, div);
+}
+
+static int rk1808_mac_set_speed_clk(struct clk *clk, ulong clk_id, uint hz)
+{
+ struct rk1808_clk_priv *priv = dev_get_priv(clk->dev);
+ struct rk1808_cru *cru = priv->cru;
+ u32 sel;
+
+ switch (clk_id) {
+ case SCLK_GMAC_RGMII_SPEED:
+ if (hz == 125000000)
+ sel = 0;
+ else if (hz == 2500000)
+ sel = 2;
+ else
+ sel = 3;
+ rk_clrsetreg(&cru->clksel_con[27], RGMII_CLK_SEL_MASK,
+ sel << RGMII_CLK_SEL_SHIFT);
+ break;
+ case SCLK_GMAC_RMII_SPEED:
+ if (hz == 2500000)
+ sel = 0;
+ else
+ sel = 1;
+ rk_clrsetreg(&cru->clksel_con[27], RMII_CLK_SEL_MASK,
+ sel << RMII_CLK_SEL_SHIFT);
+ break;
+ default:
+ return -ENOENT;
+ }
+ return 0;
+}
#endif
static ulong rk1808_bus_get_clk(struct rk1808_clk_priv *priv, ulong clk_id)
@@ -583,6 +644,7 @@ static ulong rk1808_bus_get_clk(struct rk1808_clk_priv *priv, ulong clk_id)
parent = priv->gpll_hz;
break;
case LSCLK_BUS_PRE:
+ case PCLK_WDT:
con = readl(&cru->clksel_con[28]);
div = (con & LSCLK_BUS_DIV_CON_MASK) >> LSCLK_BUS_DIV_CON_SHIFT;
parent = priv->gpll_hz;
@@ -822,6 +884,7 @@ static ulong rk1808_clk_get_rate(struct clk *clk)
case HSCLK_BUS_PRE:
case MSCLK_BUS_PRE:
case LSCLK_BUS_PRE:
+ case PCLK_WDT:
rate = rk1808_bus_get_clk(priv, clk->id);
break;
case MSCLK_PERI:
@@ -914,6 +977,14 @@ static ulong rk1808_clk_set_rate(struct clk *clk, ulong rate)
case DCLK_VOPLITE:
ret = rk1808_vop_set_clk(priv, clk->id, rate);
break;
+ case SCLK_GMAC:
+ case SCLK_GMAC_SRC:
+ ret = rk1808_mac_set_clk(clk, rate);
+ break;
+ case SCLK_GMAC_RMII_SPEED:
+ case SCLK_GMAC_RGMII_SPEED:
+ ret = rk1808_mac_set_speed_clk(clk, clk->id, rate);
+ break;
#endif
case HSCLK_BUS_PRE:
case MSCLK_BUS_PRE:
@@ -924,6 +995,8 @@ static ulong rk1808_clk_set_rate(struct clk *clk, ulong rate)
case LSCLK_PERI:
ret = rk1808_peri_set_clk(priv, clk->id, rate);
break;
+ case SCLK_32K_IOE:
+ return 0;
default:
return -ENOENT;
}
@@ -1060,11 +1133,45 @@ static int rk1808_clk_set_phase(struct clk *clk, int degrees)
return ret;
}
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+static int rk1808_gmac_set_parent(struct clk *clk, struct clk *parent)
+{
+ struct rk1808_clk_priv *priv = dev_get_priv(clk->dev);
+ struct rk1808_cru *cru = priv->cru;
+
+ if (parent->id == SCLK_GMAC_SRC) {
+ debug("%s: switching GAMC to SCLK_GMAC_SRC\n", __func__);
+ rk_clrsetreg(&cru->clksel_con[27], RMII_EXTCLK_SEL_MASK,
+ RMII_EXTCLK_SEL_INT << RMII_EXTCLK_SEL_SHIFT);
+ } else {
+ debug("%s: switching GMAC to external clock\n", __func__);
+ rk_clrsetreg(&cru->clksel_con[27], RMII_EXTCLK_SEL_MASK,
+ RMII_EXTCLK_SEL_EXT << RMII_EXTCLK_SEL_SHIFT);
+ }
+ return 0;
+}
+
+static int rk1808_clk_set_parent(struct clk *clk, struct clk *parent)
+{
+ switch (clk->id) {
+ case SCLK_GMAC:
+ return rk1808_gmac_set_parent(clk, parent);
+ case SCLK_32K_IOE:
+ return 0;
+ default:
+ return -ENOENT;
+ }
+}
+#endif
+
static struct clk_ops rk1808_clk_ops = {
.get_rate = rk1808_clk_get_rate,
.set_rate = rk1808_clk_set_rate,
.get_phase = rk1808_clk_get_phase,
.set_phase = rk1808_clk_set_phase,
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+ .set_parent = rk1808_clk_set_parent,
+#endif
};
static int rk1808_clk_probe(struct udevice *dev)
diff --git a/drivers/clk/rockchip/clk_rk3128.c b/drivers/clk/rockchip/clk_rk3128.c
index 493a0a01c7..edfdcef1c4 100644
--- a/drivers/clk/rockchip/clk_rk3128.c
+++ b/drivers/clk/rockchip/clk_rk3128.c
@@ -237,6 +237,7 @@ static ulong rk3128_peri_get_clk(struct rk3128_clk_priv *priv, ulong clk_id)
case PCLK_I2C2:
case PCLK_I2C3:
case PCLK_PWM:
+ case PCLK_WDT:
con = readl(&cru->cru_clksel_con[10]);
div = (con & PCLK_PERI_DIV_MASK) >> PCLK_PERI_DIV_SHIFT;
parent = rk3128_peri_get_clk(priv, ACLK_PERI);
@@ -503,6 +504,7 @@ static ulong rk3128_clk_get_rate(struct clk *clk)
case PCLK_I2C2:
case PCLK_I2C3:
case PCLK_PWM:
+ case PCLK_WDT:
rate = rk3128_peri_get_clk(priv, clk->id);
break;
case ACLK_CPU:
diff --git a/drivers/clk/rockchip/clk_rk3288.c b/drivers/clk/rockchip/clk_rk3288.c
index f7536bac18..b42d36cbd0 100644
--- a/drivers/clk/rockchip/clk_rk3288.c
+++ b/drivers/clk/rockchip/clk_rk3288.c
@@ -148,6 +148,10 @@ enum {
CLK_CRYPTO_DIV_CON_SHIFT = 6,
CLK_CRYPTO_DIV_CON_MASK = GENMASK(7, 6),
+ /* CLKSEL33 */
+ PCLK_ALIVE_DIV_CON_SHIFT = 8,
+ PCLK_ALIVE_DIV_CON_MASK = 0x1f << PCLK_ALIVE_DIV_CON_SHIFT,
+
SOCSTS_DPLL_LOCK = 1 << 5,
SOCSTS_APLL_LOCK = 1 << 6,
SOCSTS_CPLL_LOCK = 1 << 7,
@@ -865,6 +869,17 @@ static ulong rockchip_crypto_set_clk(struct rk3288_cru *cru,
return rockchip_crypto_get_clk(cru, gclk_rate);
}
+
+static ulong rk3288_alive_get_clk(struct rk3288_cru *cru, uint gclk_rate)
+{
+ u32 div, con, parent;
+
+ con = readl(&cru->cru_clksel_con[33]);
+ div = (con & PCLK_ALIVE_DIV_CON_MASK) >>
+ PCLK_ALIVE_DIV_CON_SHIFT;
+ parent = gclk_rate;
+ return DIV_TO_RATE(parent, div);
+}
#endif
static ulong rk3288_clk_get_rate(struct clk *clk)
@@ -914,6 +929,9 @@ static ulong rk3288_clk_get_rate(struct clk *clk)
case SCLK_CRYPTO:
new_rate = rockchip_crypto_get_clk(priv->cru, gclk_rate);
break;
+ case PCLK_WDT:
+ new_rate = rk3288_alive_get_clk(priv->cru, gclk_rate);
+ break;
#endif
default:
return -ENOENT;
diff --git a/drivers/clk/rockchip/clk_rk3308.c b/drivers/clk/rockchip/clk_rk3308.c
index fa16d7449c..75c78eaa8a 100644
--- a/drivers/clk/rockchip/clk_rk3308.c
+++ b/drivers/clk/rockchip/clk_rk3308.c
@@ -206,6 +206,52 @@ static ulong rk3308_i2c_set_clk(struct clk *clk, uint hz)
return rk3308_i2c_get_clk(clk);
}
+static ulong rk3308_mac_set_clk(struct clk *clk, uint hz)
+{
+ struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+ struct rk3308_cru *cru = priv->cru;
+ u32 con = readl(&cru->clksel_con[43]);
+ ulong pll_rate;
+ u8 div;
+
+ if ((con >> MAC_PLL_SHIFT) & MAC_SEL_VPLL0)
+ pll_rate = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL0],
+ priv->cru, VPLL0);
+ else if ((con >> MAC_PLL_SHIFT) & MAC_SEL_VPLL1)
+ pll_rate = rockchip_pll_get_rate(&rk3308_pll_clks[VPLL1],
+ priv->cru, VPLL1);
+ else
+ pll_rate = rockchip_pll_get_rate(&rk3308_pll_clks[DPLL],
+ priv->cru, DPLL);
+
+ /*default set 50MHZ for gmac*/
+ if (!hz)
+ hz = 50000000;
+
+ div = DIV_ROUND_UP(pll_rate, hz) - 1;
+ assert(div < 32);
+ rk_clrsetreg(&cru->clksel_con[43], MAC_DIV_MASK,
+ div << MAC_DIV_SHIFT);
+
+ return DIV_TO_RATE(pll_rate, div);
+}
+
+static int rk3308_mac_set_speed_clk(struct clk *clk, uint hz)
+{
+ struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+ struct rk3308_cru *cru = priv->cru;
+
+ if (hz != 2500000 && hz != 25000000) {
+ debug("Unsupported mac speed:%d\n", hz);
+ return -EINVAL;
+ }
+
+ rk_clrsetreg(&cru->clksel_con[43], MAC_CLK_SPEED_SEL_MASK,
+ ((hz == 2500000) ? 0 : 1) << MAC_CLK_SPEED_SEL_SHIFT);
+
+ return 0;
+}
+
static ulong rk3308_mmc_get_clk(struct clk *clk)
{
struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
@@ -530,6 +576,7 @@ static ulong rk3308_bus_get_clk(struct rk3308_clk_priv *priv, ulong clk_id)
div = (con & BUS_HCLK_DIV_MASK) >> BUS_HCLK_DIV_SHIFT;
break;
case PCLK_BUS:
+ case PCLK_WDT:
con = readl(&cru->clksel_con[6]);
div = (con & BUS_PCLK_DIV_MASK) >> BUS_PCLK_DIV_SHIFT;
break;
@@ -812,6 +859,7 @@ static ulong rk3308_clk_get_rate(struct clk *clk)
case ACLK_BUS:
case HCLK_BUS:
case PCLK_BUS:
+ case PCLK_WDT:
rate = rk3308_bus_get_clk(priv, clk->id);
break;
case ACLK_PERI:
@@ -867,6 +915,12 @@ static ulong rk3308_clk_set_rate(struct clk *clk, ulong rate)
case SCLK_I2C3:
ret = rk3308_i2c_set_clk(clk, rate);
break;
+ case SCLK_MAC:
+ ret = rk3308_mac_set_clk(clk, rate);
+ break;
+ case SCLK_MAC_RMII:
+ ret = rk3308_mac_set_speed_clk(clk, rate);
+ break;
case SCLK_SARADC:
ret = rk3308_saradc_set_clk(clk, rate);
break;
@@ -1033,11 +1087,46 @@ static int rk3308_clk_set_phase(struct clk *clk, int degrees)
return ret;
}
+static int __maybe_unused rk3308_mac_set_parent(struct clk *clk, struct clk *parent)
+{
+ struct rk3308_clk_priv *priv = dev_get_priv(clk->dev);
+
+ /*
+ * If the requested parent is in the same clock-controller and
+ * the id is SCLK_MAC_SRC, switch to the internal clock.
+ */
+ if (parent->id == SCLK_MAC_SRC) {
+ debug("%s: switching RMII to SCLK_MAC\n", __func__);
+ rk_clrreg(&priv->cru->clksel_con[43], BIT(14));
+ } else {
+ debug("%s: switching RMII to CLKIN\n", __func__);
+ rk_setreg(&priv->cru->clksel_con[43], BIT(14));
+ }
+
+ return 0;
+}
+
+static int __maybe_unused rk3308_clk_set_parent(struct clk *clk, struct clk *parent)
+{
+ switch (clk->id) {
+ case SCLK_MAC:
+ return rk3308_mac_set_parent(clk, parent);
+ default:
+ break;
+ }
+
+ debug("%s: unsupported clk %ld\n", __func__, clk->id);
+ return -ENOENT;
+}
+
static struct clk_ops rk3308_clk_ops = {
.get_rate = rk3308_clk_get_rate,
.set_rate = rk3308_clk_set_rate,
.get_phase = rk3308_clk_get_phase,
.set_phase = rk3308_clk_set_phase,
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+ .set_parent = rk3308_clk_set_parent,
+#endif
};
static void rk3308_clk_init(struct udevice *dev)
diff --git a/drivers/clk/rockchip/clk_rk3368.c b/drivers/clk/rockchip/clk_rk3368.c
index a3419b7945..1ed2bea3f4 100644
--- a/drivers/clk/rockchip/clk_rk3368.c
+++ b/drivers/clk/rockchip/clk_rk3368.c
@@ -774,6 +774,18 @@ static ulong rk3368_vop_set_clk(struct rk3368_cru *cru, int clk_id, uint hz)
return 0;
}
+
+static ulong rk3368_alive_get_clk(struct rk3368_clk_priv *priv)
+{
+ struct rk3368_cru *cru = priv->cru;
+ u32 div, con, parent;
+
+ con = readl(&cru->clksel_con[10]);
+ div = (con & PCLK_ALIVE_DIV_CON_MASK) >>
+ PCLK_ALIVE_DIV_CON_SHIFT;
+ parent = GPLL_HZ;
+ return DIV_TO_RATE(parent, div);
+}
#endif
static ulong rk3368_armclk_set_clk(struct rk3368_clk_priv *priv,
@@ -893,6 +905,9 @@ static ulong rk3368_clk_get_rate(struct clk *clk)
case DCLK_VOP:
rate = rk3368_vop_get_clk(priv->cru, clk->id);
break;
+ case PCLK_WDT:
+ rate = rk3368_alive_get_clk(priv);
+ break;
#endif
default:
return -ENOENT;
diff --git a/drivers/clk/rockchip/clk_rk3399.c b/drivers/clk/rockchip/clk_rk3399.c
index 814f43772e..f11fe3926b 100644
--- a/drivers/clk/rockchip/clk_rk3399.c
+++ b/drivers/clk/rockchip/clk_rk3399.c
@@ -252,6 +252,10 @@ enum {
DCLK_VOP_DIV_CON_MASK = 0xff,
DCLK_VOP_DIV_CON_SHIFT = 0,
+ /* CLKSEL_CON57 */
+ PCLK_ALIVE_DIV_CON_SHIFT = 0,
+ PCLK_ALIVE_DIV_CON_MASK = 0x1f << PCLK_ALIVE_DIV_CON_SHIFT,
+
/* CLKSEL_CON58 */
CLK_SPI_PLL_SEL_WIDTH = 1,
CLK_SPI_PLL_SEL_MASK = ((1 < CLK_SPI_PLL_SEL_WIDTH) - 1),
@@ -1117,6 +1121,17 @@ static ulong rk3399_peri_get_clk(struct rk3399_clk_priv *priv, ulong clk_id)
return DIV_TO_RATE(parent, div);
}
+static ulong rk3399_alive_get_clk(struct rk3399_clk_priv *priv)
+{
+ struct rk3399_cru *cru = priv->cru;
+ u32 div, con, parent;
+
+ con = readl(&cru->clksel_con[57]);
+ div = (con & PCLK_ALIVE_DIV_CON_MASK) >>
+ PCLK_ALIVE_DIV_CON_SHIFT;
+ parent = GPLL_HZ;
+ return DIV_TO_RATE(parent, div);
+}
#endif
static ulong rk3399_clk_get_rate(struct clk *clk)
@@ -1184,6 +1199,10 @@ static ulong rk3399_clk_get_rate(struct clk *clk)
case PCLK_PERILP1:
rate = rk3399_peri_get_clk(priv, clk->id);
break;
+ case PCLK_ALIVE:
+ case PCLK_WDT:
+ rate = rk3399_alive_get_clk(priv);
+ break;
#endif
default:
return -ENOENT;
@@ -1620,6 +1639,7 @@ static ulong rk3399_pmuclk_get_rate(struct clk *clk)
switch (clk->id) {
case PCLK_RKPWM_PMU:
+ case PCLK_WDT_M0_PMU:
rate = rk3399_pwm_get_clk(priv->pmucru);
break;
case SCLK_I2C0_PMU:
diff --git a/drivers/cpu/Kconfig b/drivers/cpu/Kconfig
index 0d1424d38e..6dfced4f4f 100644
--- a/drivers/cpu/Kconfig
+++ b/drivers/cpu/Kconfig
@@ -6,3 +6,15 @@ config CPU
multiple CPUs, then normally have to be set up in U-Boot so that
they can work correctly in the OS. This provides a framework for
finding out information about available CPUs and making changes.
+
+config AMP
+ bool "Enable AMP drivers using Driver Model"
+ help
+ This support Asymmetric Multi-Processing, cpus can run on different
+ firmware.
+
+config ROCKCHIP_AMP
+ bool "Enable Rockchip AMP driver"
+ depends on AMP && ROCKCHIP_SMCCC && RKIMG_BOOTLOADER
+ help
+ This enable Rockchip AMP driver support.
diff --git a/drivers/cpu/Makefile b/drivers/cpu/Makefile
index db515f6f17..d50912ffe5 100644
--- a/drivers/cpu/Makefile
+++ b/drivers/cpu/Makefile
@@ -5,5 +5,7 @@
# SPDX-License-Identifier: GPL-2.0+
#
obj-$(CONFIG_CPU) += cpu-uclass.o
+obj-$(CONFIG_AMP) += amp-uclass.o
obj-$(CONFIG_ARCH_BMIPS) += bmips_cpu.o
+obj-$(CONFIG_ROCKCHIP_AMP) += rockchip_amp.o
diff --git a/drivers/cpu/amp-uclass.c b/drivers/cpu/amp-uclass.c
new file mode 100644
index 0000000000..7d52722a2d
--- /dev/null
+++ b/drivers/cpu/amp-uclass.c
@@ -0,0 +1,162 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <amp.h>
+#include <dm.h>
+#include <dm/lists.h>
+
+int amp_cpu_on(u32 cpu)
+{
+ struct dm_amp_uclass_platdata *uc_pdata;
+ const struct dm_amp_ops *ops;
+ struct udevice *dev;
+ struct uclass *uc;
+ int ret;
+
+ ret = uclass_get(UCLASS_AMP, &uc);
+ if (ret)
+ return ret;
+
+ for (uclass_first_device(UCLASS_AMP, &dev);
+ dev;
+ uclass_next_device(&dev)) {
+ uc_pdata = dev_get_uclass_platdata(dev);
+ if (!uc_pdata || uc_pdata->cpu != cpu)
+ continue;
+
+ ops = dev_get_driver_ops(dev);
+ if (!ops || !ops->cpu_on)
+ return -ENOSYS;
+
+ return ops->cpu_on(dev);
+ }
+
+ return -ENODEV;
+}
+
+int amp_cpus_on(void)
+{
+ const struct dm_amp_ops *ops;
+ struct udevice *dev;
+ struct uclass *uc;
+ int ret;
+
+ ret = uclass_get(UCLASS_AMP, &uc);
+ if (ret)
+ return ret;
+
+ for (uclass_first_device(UCLASS_AMP, &dev);
+ dev;
+ uclass_next_device(&dev)) {
+ ops = dev_get_driver_ops(dev);
+ if (!ops || !ops->cpu_on)
+ continue;
+ ret = ops->cpu_on(dev);
+ }
+
+ return ret;
+}
+
+int amp_bind_children(struct udevice *dev, const char *drv_name)
+{
+ const char *name;
+ ofnode node;
+ int ret;
+
+ dev_for_each_subnode(node, dev) {
+ /*
+ * If this node has "compatible" property, this is not
+ * a amp subnode, but a normal device. skip.
+ */
+ ofnode_get_property(node, "compatible", &ret);
+ if (ret >= 0)
+ continue;
+
+ if (ret != -FDT_ERR_NOTFOUND)
+ return ret;
+
+ name = ofnode_get_name(node);
+ if (!name)
+ return -EINVAL;
+ ret = device_bind_driver_to_node(dev, drv_name, name,
+ node, NULL);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+static int amp_pre_probe(struct udevice *dev)
+{
+ struct dm_amp_uclass_platdata *uc_pdata;
+
+ uc_pdata = dev_get_uclass_platdata(dev);
+ if (!uc_pdata)
+ return -ENXIO;
+
+ uc_pdata->desc = dev_read_string(dev, "description");
+ uc_pdata->partition = dev_read_string(dev, "partition");
+ uc_pdata->cpu = dev_read_u32_default(dev, "cpu", -ENODATA);
+#ifdef CONFIG_ARM64
+ uc_pdata->aarch = dev_read_u32_default(dev, "aarch", 64);
+#else
+ uc_pdata->aarch = dev_read_u32_default(dev, "aarch", 32);
+#endif
+ uc_pdata->load = dev_read_u32_default(dev, "load", -ENODATA);
+ uc_pdata->entry = dev_read_u32_default(dev, "entry", -ENODATA);
+
+ dev_read_u32_array(dev, "memory",
+ uc_pdata->reserved_mem,
+ ARRAY_SIZE(uc_pdata->reserved_mem));
+
+ if (!uc_pdata->desc || !uc_pdata->partition ||
+ uc_pdata->cpu == -ENODATA || uc_pdata->load == -ENODATA ||
+ uc_pdata->entry == -ENODATA || !uc_pdata->reserved_mem[0] ||
+ !uc_pdata->reserved_mem[1] ||
+ (uc_pdata->aarch != 64 && uc_pdata->aarch != 32)) {
+ printf("AMP: \"%s\" is not complete\n", dev->name);
+ return -EINVAL;
+ }
+
+#ifdef DEBUG
+ printf("[%s]:\n", dev_read_name(dev));
+ printf(" descrption: %s\n", uc_pdata->desc);
+ printf(" partition: %s\n", uc_pdata->partition);
+ printf(" cpu: 0x%x\n", uc_pdata->cpu);
+ printf(" aarch: %d\n", uc_pdata->aarch);
+ printf(" load: 0x%08x\n", uc_pdata->load);
+ printf(" entry: 0x%08x\n", uc_pdata->entry);
+ printf(" reserved_mem: 0x%08x - 0x%08x\n\n",
+ uc_pdata->reserved_mem[0],
+ uc_pdata->reserved_mem[0] + uc_pdata->reserved_mem[1]);
+#endif
+
+ return 0;
+}
+
+UCLASS_DRIVER(amp) = {
+ .id = UCLASS_AMP,
+ .name = "amp",
+ .pre_probe = amp_pre_probe,
+ .per_device_platdata_auto_alloc_size =
+ sizeof(struct dm_amp_uclass_platdata),
+};
+
+#ifdef DEBUG
+static int do_amp_cpus_on(cmd_tbl_t *cmdtp, int flag,
+ int argc, char *const argv[])
+{
+ amp_cpus_on();
+ return 0;
+}
+
+U_BOOT_CMD(
+ amp_cpus_on, 1, 1, do_amp_cpus_on,
+ "Brought up all amp cpus",
+ ""
+);
+#endif
diff --git a/drivers/cpu/rockchip_amp.c b/drivers/cpu/rockchip_amp.c
new file mode 100644
index 0000000000..9408c8c1b6
--- /dev/null
+++ b/drivers/cpu/rockchip_amp.c
@@ -0,0 +1,130 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
+ */
+#include <common.h>
+#include <amp.h>
+#include <boot_rkimg.h>
+#include <bidram.h>
+#include <dm.h>
+#include <sysmem.h>
+#include <asm/arch/rockchip_smccc.h>
+
+#define AMP_I(fmt, args...) printf("AMP: "fmt, ##args)
+#define AMP_E(fmt, args...) printf("AMP Error: "fmt, ##args)
+
+/*
+ * An example for amps dts node configure:
+ *
+ * amps {
+ * compatible = "uboot,rockchip-amp";
+ * status = "okay";
+ *
+ * amp@0 {
+ * description = "mcu-os1";
+ * partition = "mcu1";
+ * cpu = <0x1>; // this is mpidr!
+ * load = <0x800000>;
+ * entry = <0x800000>;
+ * memory = <0x800000 0x400000>;
+ * };
+ *
+ * amp@1 {
+ * ......
+ * };
+ *
+ * ......
+ * };
+ *
+ * U-Boot loads "mcu-os1" firmware to "0x800000" address from partiton
+ * "mcu1" for cpu[1], the cpu[1] entry address is 0x800000. And
+ * U-Boot reserve memory from 0x800000 with 0x400000 size in order
+ * to make it invisible for kernel.
+ *
+ * Please use rockchip tool "mkkrnlimg" to pack firmware binary, example:
+ * ./scripts/mkkrnlimg mcu-os1.bin mcu-os1.img
+ */
+
+static int rockchip_amp_cpu_on(struct udevice *dev)
+{
+ struct dm_amp_uclass_platdata *uc_pdata;
+ struct blk_desc *dev_desc;
+ disk_partition_t part_info;
+ int ret, size;
+
+ uc_pdata = dev_get_uclass_platdata(dev);
+ if (!uc_pdata)
+ return -ENXIO;
+
+ dev_desc = rockchip_get_bootdev();
+ if (!dev_desc)
+ return -EEXIST;
+
+ ret = part_get_info_by_name(dev_desc, uc_pdata->partition, &part_info);
+ if (ret < 0) {
+ AMP_E("\"%s\" find partition \"%s\" failed\n",
+ uc_pdata->desc, uc_pdata->partition);
+ return ret;
+ }
+
+ ret = bidram_reserve_by_name(uc_pdata->partition,
+ uc_pdata->reserved_mem[0],
+ uc_pdata->reserved_mem[1]);
+ if (ret) {
+ AMP_E("Reserve \"%s\" region at 0x%08x - 0x%08x failed, ret=%d\n",
+ uc_pdata->desc, uc_pdata->reserved_mem[0],
+ uc_pdata->reserved_mem[0] + uc_pdata->reserved_mem[1], ret);
+ return -ENOMEM;
+ }
+
+ size = read_rockchip_image(dev_desc, &part_info,
+ (void *)(ulong)uc_pdata->load);
+ if (size < 0) {
+ AMP_E("\"%s\" load at 0x%08x failed\n",
+ uc_pdata->desc, uc_pdata->load);
+ return size;
+ }
+
+ flush_dcache_range(uc_pdata->load,
+ uc_pdata->load + ALIGN(size, ARCH_DMA_MINALIGN));
+
+ AMP_I("Brought up cpu[%x] on \"%s\" entry 0x%08x ...",
+ uc_pdata->cpu, uc_pdata->desc, uc_pdata->entry);
+
+ ret = psci_cpu_on(uc_pdata->cpu, uc_pdata->entry);
+ if (ret) {
+ printf("failed\n");
+ return ret;
+ }
+ printf("OK\n");
+
+ return 0;
+}
+
+static const struct dm_amp_ops rockchip_amp_ops = {
+ .cpu_on = rockchip_amp_cpu_on,
+};
+
+U_BOOT_DRIVER(rockchip_amp) = {
+ .name = "rockchip_amp",
+ .id = UCLASS_AMP,
+ .ops = &rockchip_amp_ops,
+};
+
+/* AMP bus driver as all amp parent */
+static int rockchip_amp_bus_bind(struct udevice *dev)
+{
+ return amp_bind_children(dev, "rockchip_amp");
+}
+
+static const struct udevice_id rockchip_amp_bus_match[] = {
+ { .compatible = "uboot,rockchip-amp", },
+ {},
+};
+
+U_BOOT_DRIVER(rockchip_amp_bus) = {
+ .name = "rockchip_amp_bus",
+ .id = UCLASS_SIMPLE_BUS,
+ .of_match = rockchip_amp_bus_match,
+ .bind = rockchip_amp_bus_bind,
+};
diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig
index 7d48cfe526..e49f23c2d2 100644
--- a/drivers/input/Kconfig
+++ b/drivers/input/Kconfig
@@ -47,7 +47,7 @@ config I8042_KEYB
config RK8XX_PWRKEY
bool "Enable RK805/816/817 pwrkey support"
- depends on DM_KEY && PMIC_RK8XX
+ depends on DM_KEY && PMIC_RK8XX && IRQ
help
This adds a driver for the RK805/816/817 pwrkey support.
diff --git a/drivers/input/adc_key.c b/drivers/input/adc_key.c
index 65645d01bc..d3d7df911c 100644
--- a/drivers/input/adc_key.c
+++ b/drivers/input/adc_key.c
@@ -4,92 +4,77 @@
* SPDX-License-Identifier: GPL-2.0+
*/
-#include <dm.h>
-#include <dm/read.h>
-#include <adc.h>
#include <common.h>
-#include <console.h>
-#include <errno.h>
-#include <fdtdec.h>
-#include <malloc.h>
+#include <dm.h>
#include <key.h>
-#include <linux/input.h>
-static int adc_keys_ofdata_to_platdata(struct udevice *dev)
+static int adc_key_ofdata_to_platdata(struct udevice *dev)
{
- struct input_key *key;
- u32 adc_channels[2], microvolt;
+ struct dm_key_uclass_platdata *uc_key;
+ u32 chn[2], mV;
int vref, ret;
- ofnode node;
- /* Get vref */
- vref = dev_read_u32_default(dev, "keyup-threshold-microvolt", -1);
- if (vref < 0) {
- printf("failed to read 'keyup-threshold-microvolt', ret=%d\n",
- vref);
- return -EINVAL;
- }
+ uc_key = dev_get_uclass_platdata(dev);
+ if (!uc_key)
+ return -ENXIO;
- /* Get IO channel */
- ret = dev_read_u32_array(dev, "io-channels", adc_channels, 2);
+ uc_key->type = ADC_KEY;
+ uc_key->name = dev_read_string(dev, "label");
+ ret = dev_read_u32_array(dev_get_parent(dev),
+ "io-channels", chn, ARRAY_SIZE(chn));
if (ret) {
- printf("failed to read 'io-channels', ret=%d\n", ret);
+ printf("%s: read 'io-channels' failed, ret=%d\n",
+ uc_key->name, ret);
return -EINVAL;
}
- /* Parse every adc key data */
- dev_for_each_subnode(node, dev) {
- key = calloc(1, sizeof(struct input_key));
- if (!key)
- return -ENOMEM;
-
- key->parent = dev;
- key->type = ADC_KEY;
- key->vref = vref;
- key->channel = adc_channels[1];
- key->name = ofnode_read_string(node, "label");
- ret = ofnode_read_u32(node, "linux,code", &key->code);
- if (ret) {
- printf("%s: failed to read 'linux,code', ret=%d\n",
- key->name, ret);
- free(key);
- continue;
- }
-
- ret = ofnode_read_u32(node, "press-threshold-microvolt",
- &microvolt);
- if (ret) {
- printf("%s: failed to read 'press-threshold-microvolt', ret=%d\n",
- key->name, ret);
- free(key);
- continue;
- }
+ vref = dev_read_u32_default(dev_get_parent(dev),
+ "keyup-threshold-microvolt", -ENODATA);
+ if (vref < 0) {
+ printf("%s: read 'keyup-threshold-microvolt' failed, ret=%d\n",
+ uc_key->name, vref);
+ return -EINVAL;
+ }
- /* Convert microvolt to adc value */
- key->adcval = microvolt / (key->vref / 1024);
- key_add(key);
+ uc_key->code = dev_read_u32_default(dev, "linux,code", -ENODATA);
+ if (uc_key->code < 0) {
+ printf("%s: read 'linux,code' failed\n", uc_key->name);
+ return -EINVAL;
+ }
- debug("%s: name=%s: code=%d, vref=%d, channel=%d, microvolt=%d, adcval=%d\n",
- __func__, key->name, key->code, key->vref,
- key->channel, microvolt, key->adcval);
+ mV = dev_read_u32_default(dev, "press-threshold-microvolt", -ENODATA);
+ if (mV < 0) {
+ printf("%s: read 'press-threshold-microvolt' failed\n",
+ uc_key->name);
+ return -EINVAL;
}
+ uc_key->channel = chn[1];
+ uc_key->adcval = mV / (vref / 1024);
+
return 0;
}
-static const struct dm_key_ops key_ops = {
- .name = "adc-keys",
+U_BOOT_DRIVER(adc_key) = {
+ .name = "adc_key",
+ .id = UCLASS_KEY,
+ .ofdata_to_platdata = adc_key_ofdata_to_platdata,
};
-static const struct udevice_id adc_keys_ids[] = {
+/* Key Bus */
+static int adc_key_bus_bind(struct udevice *dev)
+{
+ return key_bind_children(dev, "adc_key");
+}
+
+static const struct udevice_id adc_key_bus_match[] = {
{ .compatible = "adc-keys" },
{ },
};
-U_BOOT_DRIVER(adc_keys) = {
- .name = "adc-keys",
- .id = UCLASS_KEY,
- .ops = &key_ops,
- .of_match = adc_keys_ids,
- .ofdata_to_platdata = adc_keys_ofdata_to_platdata,
+U_BOOT_DRIVER(adc_key_bus) = {
+ .name = "adc_key_bus",
+ .id = UCLASS_SIMPLE_BUS,
+ .of_match = adc_key_bus_match,
+ .bind = adc_key_bus_bind,
};
diff --git a/drivers/input/gpio_key.c b/drivers/input/gpio_key.c
index 34db0d868d..053c159080 100644
--- a/drivers/input/gpio_key.c
+++ b/drivers/input/gpio_key.c
@@ -4,119 +4,55 @@
* SPDX-License-Identifier: GPL-2.0+
*/
-#include <dm.h>
-#include <adc.h>
#include <common.h>
-#include <console.h>
#include <dm.h>
-#include <errno.h>
-#include <fdtdec.h>
-#include <malloc.h>
#include <key.h>
-#include <linux/input.h>
-#include <errno.h>
-#include <dm/read.h>
-#include <irq-generic.h>
-#include <irq-platform.h>
-
-static void gpio_irq_handler(int irq, void *data)
-{
- struct input_key *key = data;
-
- if (key->irq != irq)
- return;
-
- /* up event */
- if (irq_get_gpio_level(irq)) {
- key->up_t = key_timer(0);
- debug("%s: key down: %llu ms\n", key->name, key->down_t);
- /* down event */
- } else {
- key->down_t = key_timer(0);
- debug("%s: key up: %llu ms\n", key->name, key->up_t);
- }
- /* Must delay */
- mdelay(10);
- irq_revert_irq_type(irq);
-}
static int gpio_key_ofdata_to_platdata(struct udevice *dev)
{
- struct input_key *key;
- u32 gpios[2];
- ofnode node;
- int irq, ret;
-
- dev_for_each_subnode(node, dev) {
- key = calloc(1, sizeof(struct input_key));
- if (!key)
- return -ENOMEM;
-
- key->parent = dev;
- key->type = GPIO_KEY;
- key->name = ofnode_read_string(node, "label");
- ret = ofnode_read_u32(node, "linux,code", &key->code);
- if (ret) {
- printf("%s: failed read 'linux,code', ret=%d\n",
- key->name, ret);
- free(key);
- continue;
- }
-
- /* Only register power key as interrupt */
- if (key->code == KEY_POWER) {
- ret = ofnode_read_u32_array(node, "gpios", gpios, 2);
- if (ret) {
- printf("%s: failed to read 'gpios', ret=%d\n",
- key->name, ret);
- free(key);
- continue;
- }
-
- /* Must register as interrupt, be able to wakeup system */
- irq = phandle_gpio_to_irq(gpios[0], gpios[1]);
- if (irq < 0) {
- printf("%s: failed to request irq, ret=%d\n",
- key->name, irq);
- free(key);
- continue;
- }
- key->irq = irq;
- key_add(key);
- irq_install_handler(irq, gpio_irq_handler, key);
- irq_set_irq_type(irq, IRQ_TYPE_EDGE_FALLING);
- irq_handler_enable(irq);
- } else {
- ret = gpio_request_by_name_nodev(node, "gpios", 0,
- &key->gpio,
- GPIOD_IS_IN);
- if (ret) {
- printf("%s: failed to request gpio, ret=%d\n",
- key->name, ret);
- }
-
- key_add(key);
- }
+ struct dm_key_uclass_platdata *uc_key;
+
+ uc_key = dev_get_uclass_platdata(dev);
+ if (!uc_key)
+ return -ENXIO;
+
+ uc_key->type = GPIO_KEY;
+ uc_key->name = dev_read_string(dev, "label");
+ uc_key->code = dev_read_u32_default(dev, "linux,code", -ENODATA);
+ if (uc_key->code < 0) {
+ printf("%s: read 'linux,code' failed\n", uc_key->name);
+ return -EINVAL;
+ }
- debug("%s: name=%s: code=%d\n", __func__, key->name, key->code);
+ if (dev_read_u32_array(dev, "gpios",
+ uc_key->gpios, ARRAY_SIZE(uc_key->gpios))) {
+ printf("%s: read 'gpios' failed\n", uc_key->name);
+ return -EINVAL;
}
return 0;
}
-static const struct dm_key_ops key_ops = {
- .name = "gpio-keys",
+U_BOOT_DRIVER(gpio_key) = {
+ .name = "gpio_key",
+ .id = UCLASS_KEY,
+ .ofdata_to_platdata = gpio_key_ofdata_to_platdata,
};
-static const struct udevice_id gpio_key_ids[] = {
+/* Key Bus */
+static int gpio_key_bus_bind(struct udevice *dev)
+{
+ return key_bind_children(dev, "gpio_key");
+}
+
+static const struct udevice_id gpio_key_bus_match[] = {
{ .compatible = "gpio-keys" },
{ },
};
-U_BOOT_DRIVER(gpio_keys) = {
- .name = "gpio-keys",
- .id = UCLASS_KEY,
- .of_match = gpio_key_ids,
- .ops = &key_ops,
- .ofdata_to_platdata = gpio_key_ofdata_to_platdata,
+U_BOOT_DRIVER(gpio_key_bus) = {
+ .name = "gpio_key_bus",
+ .id = UCLASS_SIMPLE_BUS,
+ .of_match = gpio_key_bus_match,
+ .bind = gpio_key_bus_bind,
};
diff --git a/drivers/input/key-uclass.c b/drivers/input/key-uclass.c
index 7f369665b2..1a370a5fa9 100644
--- a/drivers/input/key-uclass.c
+++ b/drivers/input/key-uclass.c
@@ -8,15 +8,12 @@
#include <adc.h>
#include <dm.h>
#include <key.h>
+#include <dm/lists.h>
+#include <irq-generic.h>
-static LIST_HEAD(key_list);
-
-const char *evt_name[] = {
- "Not down",
- "Down",
- "Long down",
- "Not exist",
-};
+#define KEY_WARN(fmt, args...) printf("Key Warn: "fmt, ##args)
+#define KEY_ERR(fmt, args...) printf("Key Error: "fmt, ##args)
+#define KEY_DBG(fmt, args...) debug("Key Debug: "fmt, ##args)
static inline uint64_t arch_counter_get_cntpct(void)
{
@@ -26,7 +23,7 @@ static inline uint64_t arch_counter_get_cntpct(void)
#ifdef CONFIG_ARM64
asm volatile("mrs %0, cntpct_el0" : "=r" (cval));
#else
- asm volatile ("mrrc p15, 0, %Q0, %R0, c14" : "=r" (cval));
+ asm volatile("mrrc p15, 0, %Q0, %R0, c14" : "=r" (cval));
#endif
return cval;
}
@@ -39,197 +36,263 @@ uint64_t key_timer(uint64_t base)
return (cntpct > base) ? (cntpct - base) : 0;
}
-/*
- * What's simple and complex event mean?
- *
- * simple event: key press down or none;
- * complext event: key press down, long down or none;
- */
-static int key_read_adc_simple_event(struct input_key *key, unsigned int adcval)
+static int key_adc_event(struct dm_key_uclass_platdata *uc_key, int adcval)
{
- int max, min, margin = 30;
- int keyval;
-
- /* Get min, max */
- max = key->adcval + margin;
- if (key->adcval > margin)
- min = key->adcval - margin;
- else
- min = 0;
-
- debug("%s: '%s' configure adc=%d: range[%d~%d]; hw adcval=%d\n",
- __func__, key->name, key->adcval, min, max, adcval);
-
- /* Check */
- if ((adcval <= max) && (adcval >= min)) {
- keyval = KEY_PRESS_DOWN;
- debug("%s key pressed..\n", key->name);
- } else {
- keyval = KEY_PRESS_NONE;
- }
-
- return keyval;
+ return (adcval <= uc_key->max && adcval >= uc_key->min) ?
+ KEY_PRESS_DOWN : KEY_PRESS_NONE;
}
-static int key_read_gpio_simple_event(struct input_key *key)
+static int key_gpio_event(struct dm_key_uclass_platdata *uc_key)
{
- if (!dm_gpio_is_valid(&key->gpio)) {
- printf("%s: invalid gpio\n", key->name);
+ if (!dm_gpio_is_valid(&uc_key->gpio)) {
+ KEY_ERR("'%s' Invalid gpio\n", uc_key->name);
return KEY_PRESS_NONE;
}
- return dm_gpio_get_value(&key->gpio) ? KEY_PRESS_DOWN : KEY_PRESS_NONE;
+ return dm_gpio_get_value(&uc_key->gpio) ?
+ KEY_PRESS_DOWN : KEY_PRESS_NONE;
}
-static int key_read_gpio_complex_event(struct input_key *key)
+static int key_gpio_interrupt_event(struct dm_key_uclass_platdata *uc_key)
{
- int keyval;
+ int event;
debug("%s: %s: up=%llu, down=%llu, delta=%llu\n",
- __func__, key->name, key->up_t, key->down_t,
- key->up_t - key->down_t);
+ __func__, uc_key->name, uc_key->rise_ms, uc_key->fall_ms,
+ uc_key->rise_ms - uc_key->fall_ms);
/* Possible this is machine power-on long pressed, so ignore this */
- if (key->down_t == 0 && key->up_t != 0) {
- keyval = KEY_PRESS_NONE;
+ if (uc_key->fall_ms == 0 && uc_key->rise_ms != 0) {
+ event = KEY_PRESS_NONE;
goto out;
}
- if ((key->up_t > key->down_t) &&
- (key->up_t - key->down_t) >= KEY_LONG_DOWN_MS) {
- key->up_t = 0;
- key->down_t = 0;
- keyval = KEY_PRESS_LONG_DOWN;
- debug("%s key long pressed..\n", key->name);
- } else if (key->down_t &&
- key_timer(key->down_t) >= KEY_LONG_DOWN_MS) {
- key->up_t = 0;
- key->down_t = 0;
- keyval = KEY_PRESS_LONG_DOWN;
- debug("%s key long pressed(hold)..\n", key->name);
- } else if ((key->up_t > key->down_t) &&
- (key->up_t - key->down_t) < KEY_LONG_DOWN_MS) {
- key->up_t = 0;
- key->down_t = 0;
- keyval = KEY_PRESS_DOWN;
- debug("%s key short pressed..\n", key->name);
+ if ((uc_key->rise_ms > uc_key->fall_ms) &&
+ (uc_key->rise_ms - uc_key->fall_ms) >= KEY_LONG_DOWN_MS) {
+ uc_key->rise_ms = 0;
+ uc_key->fall_ms = 0;
+ event = KEY_PRESS_LONG_DOWN;
+ KEY_DBG("%s key long pressed..\n", uc_key->name);
+ } else if (uc_key->fall_ms &&
+ key_timer(uc_key->fall_ms) >= KEY_LONG_DOWN_MS) {
+ uc_key->rise_ms = 0;
+ uc_key->fall_ms = 0;
+ event = KEY_PRESS_LONG_DOWN;
+ KEY_DBG("%s key long pressed(hold)..\n", uc_key->name);
+ } else if ((uc_key->rise_ms > uc_key->fall_ms) &&
+ (uc_key->rise_ms - uc_key->fall_ms) < KEY_LONG_DOWN_MS) {
+ uc_key->rise_ms = 0;
+ uc_key->fall_ms = 0;
+ event = KEY_PRESS_DOWN;
+ KEY_DBG("%s key short pressed..\n", uc_key->name);
/* Possible in charge animation, we enable irq after fuel gauge updated */
- } else if (key->up_t && key->down_t && (key->up_t == key->down_t)){
- key->up_t = 0;
- key->down_t = 0;
- keyval = KEY_PRESS_DOWN;
- debug("%s key short pressed..\n", key->name);
+ } else if (uc_key->rise_ms && uc_key->fall_ms &&
+ (uc_key->rise_ms == uc_key->fall_ms)) {
+ uc_key->rise_ms = 0;
+ uc_key->fall_ms = 0;
+ event = KEY_PRESS_DOWN;
+ KEY_DBG("%s key short pressed..\n", uc_key->name);
} else {
- keyval = KEY_PRESS_NONE;
+ event = KEY_PRESS_NONE;
}
out:
- return keyval;
+ return event;
+}
+
+int key_is_pressed(int event)
+{
+ return (event == KEY_PRESS_DOWN || event == KEY_PRESS_LONG_DOWN);
}
-static int key_read_gpio_interrupt_event(struct input_key *key)
+static int key_core_read(struct dm_key_uclass_platdata *uc_key)
{
- debug("%s: %s\n", __func__, key->name);
+ unsigned int adcval;
+
+ if (uc_key->type == ADC_KEY) {
+ if (adc_channel_single_shot("saradc",
+ uc_key->channel, &adcval)) {
+ KEY_ERR("%s failed to read saradc\n", uc_key->name);
+ return KEY_NOT_EXIST;
+ }
- return key_read_gpio_complex_event(key);
+ return key_adc_event(uc_key, adcval);
+ }
+
+ return (uc_key->code == KEY_POWER) ?
+ key_gpio_interrupt_event(uc_key) :
+ key_gpio_event(uc_key);
}
-int key_is_pressed(int keyval)
+int key_read(int code)
{
- return (keyval == KEY_PRESS_DOWN || keyval == KEY_PRESS_LONG_DOWN);
+ struct dm_key_uclass_platdata *uc_key;
+ struct udevice *dev;
+ struct uclass *uc;
+ bool allow_pre_reloc = false;
+ int ret, event = KEY_NOT_EXIST;
+
+ ret = uclass_get(UCLASS_KEY, &uc);
+ if (ret)
+ return ret;
+
+try_again:
+ for (uclass_first_device(UCLASS_KEY, &dev);
+ dev;
+ uclass_next_device(&dev)) {
+ uc_key = dev_get_uclass_platdata(dev);
+
+ if (!allow_pre_reloc && uc_key->pre_reloc)
+ continue;
+
+ if (uc_key->code != code)
+ continue;
+
+ event = key_core_read(uc_key);
+ if (key_is_pressed(event))
+ return event;
+ }
+
+ /* If not find valid key node from kernel, try from u-boot */
+ if (event == KEY_NOT_EXIST && !allow_pre_reloc) {
+ allow_pre_reloc = true;
+ goto try_again;
+ }
+
+ return event;
}
-void key_add(struct input_key *key)
+#ifdef CONFIG_IRQ
+static void gpio_irq_handler(int irq, void *data)
{
- if (!key)
- return;
+ struct dm_key_uclass_platdata *uc_key = data;
- if (!key->parent) {
- printf("Err: Can't find key(code=%d) device\n", key->code);
+ if (uc_key->irq != irq)
return;
+
+ if (irq_get_gpio_level(irq)) {
+ uc_key->rise_ms = key_timer(0);
+ KEY_DBG("%s: key dn: %llu ms\n", uc_key->name, uc_key->fall_ms);
+ } else {
+ uc_key->fall_ms = key_timer(0);
+ KEY_DBG("%s: key up: %llu ms\n", uc_key->name, uc_key->rise_ms);
}
- key->pre_reloc = dev_read_bool(key->parent, "u-boot,dm-pre-reloc");
- list_add_tail(&key->link, &key_list);
+ /* Must delay */
+ mdelay(10);
+ irq_revert_irq_type(irq);
}
+#endif
-static int __key_read(struct input_key *key)
+int key_bind_children(struct udevice *dev, const char *drv_name)
{
- unsigned int adcval;
- int keyval = KEY_NOT_EXIST;
+ const char *name;
+ ofnode node;
int ret;
- /* Is a adc key? */
- if (key->type & ADC_KEY) {
- ret = adc_channel_single_shot("saradc",
- key->channel, &adcval);
+ dev_for_each_subnode(node, dev) {
+ /*
+ * If this node has "compatible" property, this is not
+ * a amp subnode, but a normal device. skip.
+ */
+ ofnode_get_property(node, "compatible", &ret);
+ if (ret >= 0)
+ continue;
+
+ if (ret != -FDT_ERR_NOTFOUND)
+ return ret;
+
+ name = ofnode_get_name(node);
+ if (!name)
+ return -EINVAL;
+ ret = device_bind_driver_to_node(dev, drv_name, name,
+ node, NULL);
if (ret)
- printf("%s: failed to read saradc, ret=%d\n",
- key->name, ret);
- else
- keyval = key_read_adc_simple_event(key, adcval);
- /* Is a gpio key? */
- } else if (key->type & GPIO_KEY) {
- /* All pwrkey must register as an interrupt event */
- if (key->code == KEY_POWER)
- keyval = key_read_gpio_interrupt_event(key);
- else
- keyval = key_read_gpio_simple_event(key);
- } else {
- printf("%s: invalid key type!\n", __func__);
+ return ret;
}
- debug("%s: '%s'(code=%d) is %s\n",
- __func__, key->name, key->code, evt_name[keyval]);
-
- return keyval;
+ return 0;
}
-int key_read(int code)
+static int key_post_probe(struct udevice *dev)
{
- struct udevice *dev;
- struct input_key *key;
- static int initialized;
- int keyval = KEY_NOT_EXIST;
-
- /* Initialize all key drivers */
- if (!initialized) {
- for (uclass_first_device(UCLASS_KEY, &dev);
- dev;
- uclass_next_device(&dev)) {
- debug("%s: have found key driver '%s'\n\n",
- __func__, dev->name);
- }
- }
+ struct dm_key_uclass_platdata *uc_key;
+ int margin = 30;
+ int ret;
- /* The key from kernel dtb has higher priority */
- debug("Reading key from kernel\n");
- list_for_each_entry(key, &key_list, link) {
- if (key->pre_reloc || (key->code != code))
- continue;
+ uc_key = dev_get_uclass_platdata(dev);
+ if (!uc_key)
+ return -ENXIO;
+
+ /* True from U-Boot key node */
+ uc_key->pre_reloc = dev_read_bool(dev, "u-boot,dm-pre-reloc");
- keyval = __key_read(key);
- if (key_is_pressed(keyval))
- return keyval;
+ if (uc_key->type == ADC_KEY) {
+ uc_key->max = uc_key->adcval + margin;
+ uc_key->min = uc_key->adcval > margin ?
+ uc_key->adcval - margin : 0;
+ } else {
+ if (uc_key->code == KEY_POWER) {
+ /* The gpio irq has been setup by key driver */
+ if (uc_key->irq)
+ goto finish;
+#ifdef CONFIG_IRQ
+ int irq;
+
+ irq = phandle_gpio_to_irq(uc_key->gpios[0],
+ uc_key->gpios[1]);
+ if (irq < 0) {
+ KEY_ERR("%s: failed to request irq, ret=%d\n",
+ uc_key->name, irq);
+ return irq;
+ }
+
+ uc_key->irq = irq;
+ irq_install_handler(irq, gpio_irq_handler, uc_key);
+ irq_set_irq_type(irq, IRQ_TYPE_EDGE_FALLING);
+ irq_handler_enable(irq);
+#else
+ KEY_WARN("%s: no IRQ framework available\n", uc_key->name);
+#endif
+ } else {
+ ret = gpio_request_by_name(dev, "gpios", 0,
+ &uc_key->gpio, GPIOD_IS_IN);
+ if (ret) {
+ KEY_ERR("%s: failed to request gpio, ret=%d\n",
+ uc_key->name, ret);
+ return ret;
+ }
+ }
}
- /* If not found any key from kernel dtb, reading from U-Boot dtb */
- if (keyval == KEY_NOT_EXIST) {
- debug("Reading key from U-Boot\n");
- list_for_each_entry(key, &key_list, link) {
- if (!key->pre_reloc || (key->code != code))
- continue;
+finish:
+#ifdef DEBUG
+ printf("[%s] (%s, %s, %s):\n", uc_key->name,
+ uc_key->type == ADC_KEY ? "ADC" : "GPIO",
+ uc_key->pre_reloc ? "U-Boot" : "Kernel",
+ dev->parent->name);
+
+ if (uc_key->type == ADC_KEY) {
+ printf(" adcval: %d (%d, %d)\n", uc_key->adcval,
+ uc_key->min, uc_key->max);
+ printf(" channel: %d\n\n", uc_key->channel);
+ } else {
+ const char *gpio_name =
+ ofnode_get_name(ofnode_get_by_phandle(uc_key->gpios[0]));
- keyval = __key_read(key);
- if (key_is_pressed(keyval))
- return keyval;
- }
+ printf(" irq: %d\n", uc_key->irq);
+ printf(" gpio[0]: %s\n", gpio_name);
+ printf(" gpio[1]: %d\n\n", uc_key->gpios[1]);
}
+#endif
- return keyval;
+ return 0;
}
UCLASS_DRIVER(key) = {
.id = UCLASS_KEY,
.name = "key",
+ .post_probe = key_post_probe,
+ .per_device_platdata_auto_alloc_size =
+ sizeof(struct dm_key_uclass_platdata),
};
diff --git a/drivers/input/rk8xx_pwrkey.c b/drivers/input/rk8xx_pwrkey.c
index fc3ee631e5..14fe5bce3f 100644
--- a/drivers/input/rk8xx_pwrkey.c
+++ b/drivers/input/rk8xx_pwrkey.c
@@ -105,7 +105,7 @@ static void pwrkey_irq_handler(int irq, void *data)
{
struct udevice *dev = data;
struct rk8xx_key_priv *priv = dev_get_priv(dev);
- struct input_key *key = dev_get_platdata(dev);
+ struct dm_key_uclass_platdata *uc_key = dev_get_uclass_platdata(dev);
int ret, val, i;
debug("%s: irq = %d\n", __func__, irq);
@@ -135,14 +135,14 @@ static void pwrkey_irq_handler(int irq, void *data)
/* fall event */
if (val & priv->pwron_fall_int) {
- key->down_t = key_timer(0);
- debug("%s: key down: %llu ms\n", __func__, key->down_t);
+ uc_key->fall_ms = key_timer(0);
+ debug("%s: key down: %llu ms\n", __func__, uc_key->fall_ms);
}
/* rise event */
if (val & priv->pwron_rise_int) {
- key->up_t = key_timer(0);
- debug("%s: key up: %llu ms\n", __func__, key->up_t);
+ uc_key->rise_ms = key_timer(0);
+ debug("%s: key up: %llu ms\n", __func__, uc_key->rise_ms);
}
/* clear intertup */
@@ -162,33 +162,31 @@ static void pwrkey_irq_handler(int irq, void *data)
static int pwrkey_interrupt_init(struct udevice *dev)
{
- struct input_key *key = dev_get_platdata(dev);
+ struct dm_key_uclass_platdata *uc_key = dev_get_uclass_platdata(dev);
u32 interrupt[2], phandle;
int irq, ret;
phandle = dev_read_u32_default(dev->parent, "interrupt-parent", -1);
if (phandle < 0) {
- printf("failed get 'interrupt-parent', ret=%d\n", phandle);
+ printf("read 'interrupt-parent' failed, ret=%d\n", phandle);
return phandle;
}
ret = dev_read_u32_array(dev->parent, "interrupts", interrupt, 2);
if (ret) {
- printf("failed get 'interrupt', ret=%d\n", ret);
+ printf("read 'interrupt' failed, ret=%d\n", ret);
return ret;
}
- key->parent = dev;
- key->name = "rk8xx_pwrkey";
- key->code = KEY_POWER;
- key->type = GPIO_KEY;
+ uc_key->name = "rk8xx_pwr";
+ uc_key->type = GPIO_KEY;
+ uc_key->code = KEY_POWER;
irq = phandle_gpio_to_irq(phandle, interrupt[0]);
if (irq < 0) {
- printf("%s: failed to request irq, ret=%d\n", key->name, irq);
+ printf("%s: request irq failed, ret=%d\n", uc_key->name, irq);
return irq;
}
- key->irq = irq;
- key_add(key);
+ uc_key->irq = irq;
irq_install_handler(irq, pwrkey_irq_handler, dev);
irq_set_irq_type(irq, IRQ_TYPE_EDGE_FALLING);
irq_handler_enable(irq);
@@ -196,10 +194,6 @@ static int pwrkey_interrupt_init(struct udevice *dev)
return 0;
}
-static const struct dm_key_ops key_ops = {
- .name = "rk8xx-pwrkey",
-};
-
static int rk8xx_pwrkey_probe(struct udevice *dev)
{
struct rk8xx_priv *rk8xx = dev_get_priv(dev->parent);
@@ -270,8 +264,6 @@ static int rk8xx_pwrkey_probe(struct udevice *dev)
U_BOOT_DRIVER(rk8xx_pwrkey) = {
.name = "rk8xx_pwrkey",
.id = UCLASS_KEY,
- .ops = &key_ops,
.probe = rk8xx_pwrkey_probe,
- .platdata_auto_alloc_size = sizeof(struct input_key),
.priv_auto_alloc_size = sizeof(struct rk8xx_key_priv),
};
diff --git a/drivers/input/rk_key.c b/drivers/input/rk_key.c
index 44f2b5d4a7..2619a8e3b0 100644
--- a/drivers/input/rk_key.c
+++ b/drivers/input/rk_key.c
@@ -4,145 +4,65 @@
* SPDX-License-Identifier: GPL-2.0+
*/
-#include <dm.h>
-#include <adc.h>
#include <common.h>
-#include <console.h>
#include <dm.h>
-#include <errno.h>
-#include <fdtdec.h>
-#include <malloc.h>
#include <key.h>
-#include <linux/input.h>
-#include <errno.h>
-#include <dm/read.h>
-#include <irq-generic.h>
-#include <irq-platform.h>
-static void gpio_irq_handler(int irq, void *data)
+static int rk_key_ofdata_to_platdata(struct udevice *dev)
{
- struct input_key *key = data;
+ struct dm_key_uclass_platdata *uc_key;
+ u32 chn[2];
- if (key->irq != irq)
- return;
+ uc_key = dev_get_uclass_platdata(dev);
+ if (!uc_key)
+ return -ENXIO;
- /* up event */
- if (irq_get_gpio_level(irq)) {
- key->up_t = key_timer(0);
- debug("%s: key down: %llu ms\n", key->name, key->down_t);
- /* down event */
- } else {
- key->down_t = key_timer(0);
- debug("%s: key up: %llu ms\n", key->name, key->up_t);
- }
- /* Must delay */
- mdelay(10);
- irq_revert_irq_type(irq);
-}
+ uc_key->name = dev_read_string(dev, "label");
+ uc_key->code = dev_read_u32_default(dev, "linux,code", -ENODATA);
-static int rk_keys_ofdata_to_platdata(struct udevice *dev)
-{
- struct input_key *key;
- u32 adc_channels[2], gpios[2], adcval;
- int irq, ret;
- ofnode node;
-
- /* Get IO channel */
- if (dev_read_u32_array(dev, "io-channels", adc_channels, 2)) {
- printf("%s: failed to read 'io-channels'\n", __func__);
+ if (dev_read_u32_array(dev_get_parent(dev), "io-channels", chn, 2)) {
+ printf("%s: read 'io-channels' failed\n", uc_key->name);
return -EINVAL;
}
- dev_for_each_subnode(node, dev) {
- key = calloc(1, sizeof(struct input_key));
- if (!key)
- return -ENOMEM;
-
- /* This is an ACD key */
- if (!ofnode_read_u32(node, "rockchip,adc_value", &adcval)) {
- key->parent = dev;
- key->name = ofnode_read_string(node, "label");
- key->type = ADC_KEY;
- key->adcval = adcval;
- key->channel = adc_channels[1];
- if (ofnode_read_u32(node, "linux,code", &key->code)) {
- printf("%s: failed to read 'linux,code'\n",
- key->name);
- free(key);
- continue;
- }
- key_add(key);
- /* This is a GPIO key */
- } else {
- key->parent = dev;
- key->type = GPIO_KEY;
- key->name = ofnode_read_string(node, "label");
- ret = ofnode_read_u32(node, "linux,code", &key->code);
- if (ret) {
- printf("%s: failed read 'linux,code', ret=%d\n",
- key->name, ret);
- free(key);
- continue;
- }
-
- /* Only register power key as interrupt */
- if (key->code == KEY_POWER) {
- ret = ofnode_read_u32_array(node, "gpios",
- gpios, 2);
- if (ret) {
- printf("%s: failed to read 'gpios', ret=%d\n",
- key->name, ret);
- free(key);
- continue;
- }
-
- /* Request irq */
- irq = phandle_gpio_to_irq(gpios[0], gpios[1]);
- if (irq < 0) {
- printf("%s: failed to request irq, ret=%d\n",
- __func__, irq);
- free(key);
- continue;
- }
- key->irq = irq;
- key_add(key);
- irq_install_handler(irq, gpio_irq_handler, key);
- irq_set_irq_type(irq, IRQ_TYPE_EDGE_FALLING);
- irq_handler_enable(irq);
- } else {
- ret = gpio_request_by_name_nodev(node, "gpios",
- 0, &key->gpio, GPIOD_IS_IN);
- if (ret) {
- printf("%s: failed to request gpio, ret=%d\n",
- key->name, ret);
- free(key);
- continue;
- }
- key_add(key);
- }
+ if (dev_read_bool(dev, "rockchip,adc_value")) {
+ uc_key->type = ADC_KEY;
+ uc_key->channel = chn[1];
+ uc_key->adcval =
+ dev_read_u32_default(dev, "rockchip,adc_value", 0);
+ } else {
+ uc_key->type = GPIO_KEY;
+ if (dev_read_u32_array(dev, "gpios",
+ uc_key->gpios,
+ ARRAY_SIZE(uc_key->gpios))) {
+ printf("%s: read 'gpios' failed\n", uc_key->name);
+ return -EINVAL;
}
-
- debug("%s: name=%s: code=%d, adcval=%d, channel=%d, type=%d\n",
- __func__, key->name, key->code, key->adcval,
- key->channel, key->type);
}
return 0;
}
-static const struct dm_key_ops key_ops = {
- .name = "rk-keys",
+U_BOOT_DRIVER(rk_key) = {
+ .name = "rk_key",
+ .id = UCLASS_KEY,
+ .ofdata_to_platdata = rk_key_ofdata_to_platdata,
};
-static const struct udevice_id rk_keys_ids[] = {
+/* Key Bus */
+static int rk_key_bus_bind(struct udevice *dev)
+{
+ return key_bind_children(dev, "rk_key");
+}
+
+static const struct udevice_id rk_key_bus_match[] = {
{ .compatible = "rockchip,key" },
{ },
};
-U_BOOT_DRIVER(rk_keys) = {
- .name = "rk-keys",
- .id = UCLASS_KEY,
- .ops = &key_ops,
- .of_match = rk_keys_ids,
- .ofdata_to_platdata = rk_keys_ofdata_to_platdata,
+U_BOOT_DRIVER(rk_key_bus) = {
+ .name = "rk_key_bus",
+ .id = UCLASS_SIMPLE_BUS,
+ .of_match = rk_key_bus_match,
+ .bind = rk_key_bus_bind,
};
diff --git a/drivers/irq/irq-gpio-switch.h b/drivers/irq/irq-gpio-switch.h
index 1442825132..a46604fb03 100644
--- a/drivers/irq/irq-gpio-switch.h
+++ b/drivers/irq/irq-gpio-switch.h
@@ -26,6 +26,7 @@ struct gpio_bank {
int id;
int irq_base;
int ngpio;
+ int use_count;
};
#define GPIO_BANK_REGISTER(ID, GPIO_BANK_NUM) \
@@ -35,6 +36,7 @@ struct gpio_bank {
.id = ID, \
.irq_base = PIN_BASE + (ID) * (GPIO_BANK_NUM), \
.ngpio = GPIO_BANK_NUM, \
+ .use_count = 0 \
}
/* gpio bank[31:8] and pin[7:0] */
diff --git a/drivers/irq/irq-gpio.c b/drivers/irq/irq-gpio.c
index ce88cc8f7b..3e61d188fa 100644
--- a/drivers/irq/irq-gpio.c
+++ b/drivers/irq/irq-gpio.c
@@ -276,6 +276,10 @@ static int gpio_irq_enable(int gpio_irq)
gpio_irq_unmask(bank->regbase, offset_to_bit(gpio));
+ if (bank->use_count == 0)
+ irq_handler_enable(IRQ_GPIO0 + bank->id);
+ bank->use_count++;
+
return 0;
}
@@ -293,6 +297,10 @@ static int gpio_irq_disable(int irq)
gpio_irq_mask(bank->regbase, offset_to_bit(gpio));
+ if (bank->use_count == 1)
+ irq_handler_disable(IRQ_GPIO0 + bank->id);
+ bank->use_count--;
+
return 0;
}
@@ -311,8 +319,8 @@ static int gpio_irq_init(void)
irq_install_handler(IRQ_GPIO0 + bank->id,
(interrupt_handler_t *)generic_gpio_handle_irq, NULL);
- /* default enable all gpio group interrupt */
- irq_handler_enable(IRQ_GPIO0 + bank->id);
+ /* default disable all gpio group interrupt */
+ irq_handler_disable(IRQ_GPIO0 + bank->id);
}
}
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index 3d282d5b14..f936fd791f 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -41,6 +41,13 @@ config ROCKCHIP_EFUSE
extended (by porting the read function from the Linux kernel sources)
to support other recent Rockchip devices.
+config ROCKCHIP_OTP
+ bool "Rockchip OTP Support"
+ depends on MISC
+ help
+ This is a simple drive to dump specified values of Rockchip SoC
+ from otp, such as cpu-leakage.
+
config CMD_CROS_EC
bool "Enable crosec command"
depends on CROS_EC
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index 1e6a58d2f8..72f3156812 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -52,3 +52,4 @@ obj-$(CONFIG_FSL_DEVICE_DISABLE) += fsl_devdis.o
obj-$(CONFIG_WINBOND_W83627) += winbond_w83627.o
obj-$(CONFIG_QFW) += qfw.o
obj-$(CONFIG_ROCKCHIP_EFUSE) += rockchip-efuse.o
+obj-$(CONFIG_ROCKCHIP_OTP) += rockchip-otp.o
diff --git a/drivers/misc/rockchip-efuse.c b/drivers/misc/rockchip-efuse.c
index d23e091940..a2e4da408f 100644
--- a/drivers/misc/rockchip-efuse.c
+++ b/drivers/misc/rockchip-efuse.c
@@ -16,6 +16,46 @@
#include <linux/delay.h>
#include <misc.h>
+#define T_CSB_P_S 0
+#define T_PGENB_P_S 0
+#define T_LOAD_P_S 0
+#define T_ADDR_P_S 0
+#define T_STROBE_P_S (0 + 110) /* 1.1us */
+#define T_CSB_P_L (0 + 110 + 1000 + 20) /* 200ns */
+#define T_PGENB_P_L (0 + 110 + 1000 + 20)
+#define T_LOAD_P_L (0 + 110 + 1000 + 20)
+#define T_ADDR_P_L (0 + 110 + 1000 + 20)
+#define T_STROBE_P_L (0 + 110 + 1000) /* 10us */
+#define T_CSB_R_S 0
+#define T_PGENB_R_S 0
+#define T_LOAD_R_S 0
+#define T_ADDR_R_S 2
+#define T_STROBE_R_S (2 + 3)
+#define T_CSB_R_L (2 + 3 + 3 + 3)
+#define T_PGENB_R_L (2 + 3 + 3 + 3)
+#define T_LOAD_R_L (2 + 3 + 3 + 3)
+#define T_ADDR_R_L (2 + 3 + 3 + 2)
+#define T_STROBE_R_L (2 + 3 + 3)
+
+#define T_CSB_P 0x28
+#define T_PGENB_P 0x2c
+#define T_LOAD_P 0x30
+#define T_ADDR_P 0x34
+#define T_STROBE_P 0x38
+#define T_CSB_R 0x3c
+#define T_PGENB_R 0x40
+#define T_LOAD_R 0x44
+#define T_ADDR_R 0x48
+#define T_STROBE_R 0x4c
+
+#define RK1808_USER_MODE BIT(0)
+#define RK1808_INT_FINISH BIT(0)
+#define RK1808_AUTO_ENB BIT(0)
+#define RK1808_AUTO_RD BIT(1)
+#define RK1808_A_SHIFT 16
+#define RK1808_A_MASK 0x3ff
+#define RK1808_NBYTES 4
+
#define RK3399_A_SHIFT 16
#define RK3399_A_MASK 0x3ff
#define RK3399_NFUSES 32
@@ -106,6 +146,76 @@ U_BOOT_CMD(
);
#endif
+static void rk1808_efuse_timing_init(void __iomem *base)
+{
+ static bool init;
+
+ if (init)
+ return;
+
+ /* enable auto mode */
+ writel(readl(base) & (~RK1808_USER_MODE), base);
+
+ /* setup efuse timing */
+ writel((T_CSB_P_S << 16) | T_CSB_P_L, base + T_CSB_P);
+ writel((T_PGENB_P_S << 16) | T_PGENB_P_L, base + T_PGENB_P);
+ writel((T_LOAD_P_S << 16) | T_LOAD_P_L, base + T_LOAD_P);
+ writel((T_ADDR_P_S << 16) | T_ADDR_P_L, base + T_ADDR_P);
+ writel((T_STROBE_P_S << 16) | T_STROBE_P_L, base + T_STROBE_P);
+ writel((T_CSB_R_S << 16) | T_CSB_R_L, base + T_CSB_R);
+ writel((T_PGENB_R_S << 16) | T_PGENB_R_L, base + T_PGENB_R);
+ writel((T_LOAD_R_S << 16) | T_LOAD_R_L, base + T_LOAD_R);
+ writel((T_ADDR_R_S << 16) | T_ADDR_R_L, base + T_ADDR_R);
+ writel((T_STROBE_R_S << 16) | T_STROBE_R_L, base + T_STROBE_R);
+
+ init = true;
+}
+
+static int rockchip_rk1808_efuse_read(struct udevice *dev, int offset,
+ void *buf, int size)
+{
+ struct rockchip_efuse_platdata *plat = dev_get_platdata(dev);
+ struct rockchip_efuse_regs *efuse =
+ (struct rockchip_efuse_regs *)plat->base;
+ unsigned int addr_start, addr_end, addr_offset, addr_len;
+ u32 out_value, status;
+ u8 *buffer;
+ int ret = 0, i = 0;
+
+ rk1808_efuse_timing_init(plat->base);
+
+ addr_start = rounddown(offset, RK1808_NBYTES) / RK1808_NBYTES;
+ addr_end = roundup(offset + size, RK1808_NBYTES) / RK1808_NBYTES;
+ addr_offset = offset % RK1808_NBYTES;
+ addr_len = addr_end - addr_start;
+
+ buffer = calloc(1, sizeof(*buffer) * addr_len * RK1808_NBYTES);
+ if (!buffer)
+ return -ENOMEM;
+
+ while (addr_len--) {
+ writel(RK1808_AUTO_RD | RK1808_AUTO_ENB |
+ ((addr_start++ & RK1808_A_MASK) << RK1808_A_SHIFT),
+ &efuse->auto_ctrl);
+ udelay(2);
+ status = readl(&efuse->int_status);
+ if (!(status & RK1808_INT_FINISH)) {
+ ret = -EIO;
+ goto err;
+ }
+ out_value = readl(&efuse->dout2);
+ writel(RK1808_INT_FINISH, &efuse->int_status);
+
+ memcpy(&buffer[i], &out_value, RK1808_NBYTES);
+ i += RK1808_NBYTES;
+ }
+ memcpy(buf, buffer + addr_offset, size);
+err:
+ kfree(buffer);
+
+ return ret;
+}
+
static int rockchip_rk3399_efuse_read(struct udevice *dev, int offset,
void *buf, int size)
{
@@ -270,6 +380,10 @@ static int rockchip_efuse_ofdata_to_platdata(struct udevice *dev)
static const struct udevice_id rockchip_efuse_ids[] = {
{
+ .compatible = "rockchip,rk1808-efuse",
+ .data = (ulong)&rockchip_rk1808_efuse_read,
+ },
+ {
.compatible = "rockchip,rockchip-efuse",
.data = (ulong)&rockchip_rk3288_efuse_read,
},
diff --git a/drivers/misc/rockchip-otp.c b/drivers/misc/rockchip-otp.c
new file mode 100644
index 0000000000..c6ec5d9b3f
--- /dev/null
+++ b/drivers/misc/rockchip-otp.c
@@ -0,0 +1,213 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <command.h>
+#include <dm.h>
+#include <linux/bitops.h>
+#include <linux/delay.h>
+#include <misc.h>
+
+/* OTP Register Offsets */
+#define OTPC_SBPI_CTRL 0x0020
+#define OTPC_SBPI_CMD_VALID_PRE 0x0024
+#define OTPC_SBPI_CS_VALID_PRE 0x0028
+#define OTPC_SBPI_STATUS 0x002C
+#define OTPC_USER_CTRL 0x0100
+#define OTPC_USER_ADDR 0x0104
+#define OTPC_USER_ENABLE 0x0108
+#define OTPC_USER_Q 0x0124
+#define OTPC_INT_STATUS 0x0304
+#define OTPC_SBPI_CMD0_OFFSET 0x1000
+#define OTPC_SBPI_CMD1_OFFSET 0x1004
+
+/* OTP Register bits and masks */
+#define OTPC_USER_ADDR_MASK GENMASK(31, 16)
+#define OTPC_USE_USER BIT(0)
+#define OTPC_USE_USER_MASK GENMASK(16, 16)
+#define OTPC_USER_FSM_ENABLE BIT(0)
+#define OTPC_USER_FSM_ENABLE_MASK GENMASK(16, 16)
+#define OTPC_SBPI_DONE BIT(1)
+#define OTPC_USER_DONE BIT(2)
+
+#define SBPI_DAP_ADDR 0x02
+#define SBPI_DAP_ADDR_SHIFT 8
+#define SBPI_DAP_ADDR_MASK GENMASK(31, 24)
+#define SBPI_CMD_VALID_MASK GENMASK(31, 16)
+#define SBPI_DAP_CMD_WRF 0xC0
+#define SBPI_DAP_REG_ECC 0x3A
+#define SBPI_ECC_ENABLE 0x00
+#define SBPI_ECC_DISABLE 0x09
+#define SBPI_ENABLE BIT(0)
+#define SBPI_ENABLE_MASK GENMASK(16, 16)
+
+#define OTPC_TIMEOUT 10000
+
+typedef int (*OTP_READ)(struct udevice *dev, int offset, void *buf, int size);
+
+struct rockchip_otp_platdata {
+ void __iomem *base;
+};
+
+#if defined(DEBUG)
+static int dump_otps(cmd_tbl_t *cmdtp, int flag,
+ int argc, char * const argv[])
+{
+ struct udevice *dev;
+ u8 otps[64] = {0};
+ int ret;
+
+ /* retrieve the device */
+ ret = uclass_get_device_by_driver(UCLASS_MISC,
+ DM_GET_DRIVER(rockchip_otp), &dev);
+ if (ret) {
+ printf("%s: no misc-device found\n", __func__);
+ return 0;
+ }
+
+ ret = misc_read(dev, 0, &otps, sizeof(otps));
+ if (ret) {
+ printf("%s: misc_read failed\n", __func__);
+ return 0;
+ }
+
+ printf("otp-contents:\n");
+ print_buffer(0, otps, 1, 64, 16);
+
+ return 0;
+}
+
+U_BOOT_CMD(
+ rockchip_dump_otps, 1, 1, dump_otps,
+ "Dump the content of the otps",
+ ""
+);
+#endif
+
+static int rockchip_otp_wait_status(struct rockchip_otp_platdata *otp,
+ u32 flag)
+{
+ int delay = OTPC_TIMEOUT;
+
+ while (!(readl(otp->base + OTPC_INT_STATUS) & flag)) {
+ udelay(1);
+ delay--;
+ if (delay <= 0) {
+ printf("%s: wait init status timeout\n", __func__);
+ return -ETIMEDOUT;
+ }
+ }
+
+ /* clean int status */
+ writel(flag, otp->base + OTPC_INT_STATUS);
+
+ return 0;
+}
+
+static int rockchip_otp_ecc_enable(struct rockchip_otp_platdata *otp,
+ bool enable)
+{
+ int ret = 0;
+
+ writel(SBPI_DAP_ADDR_MASK | (SBPI_DAP_ADDR << SBPI_DAP_ADDR_SHIFT),
+ otp->base + OTPC_SBPI_CTRL);
+
+ writel(SBPI_CMD_VALID_MASK | 0x1, otp->base + OTPC_SBPI_CMD_VALID_PRE);
+ writel(SBPI_DAP_CMD_WRF | SBPI_DAP_REG_ECC,
+ otp->base + OTPC_SBPI_CMD0_OFFSET);
+ if (enable)
+ writel(SBPI_ECC_ENABLE, otp->base + OTPC_SBPI_CMD1_OFFSET);
+ else
+ writel(SBPI_ECC_DISABLE, otp->base + OTPC_SBPI_CMD1_OFFSET);
+
+ writel(SBPI_ENABLE_MASK | SBPI_ENABLE, otp->base + OTPC_SBPI_CTRL);
+
+ ret = rockchip_otp_wait_status(otp, OTPC_SBPI_DONE);
+ if (ret < 0)
+ printf("%s timeout during ecc_enable\n", __func__);
+
+ return ret;
+}
+
+static int rockchip_px30_otp_read(struct udevice *dev, int offset,
+ void *buf, int size)
+{
+ struct rockchip_otp_platdata *otp = dev_get_platdata(dev);
+ u8 *buffer = buf;
+ int ret = 0;
+
+ ret = rockchip_otp_ecc_enable(otp, false);
+ if (ret < 0) {
+ printf("%s rockchip_otp_ecc_enable err\n", __func__);
+ return ret;
+ }
+
+ writel(OTPC_USE_USER | OTPC_USE_USER_MASK, otp->base + OTPC_USER_CTRL);
+ udelay(5);
+ while (size--) {
+ writel(offset++ | OTPC_USER_ADDR_MASK,
+ otp->base + OTPC_USER_ADDR);
+ writel(OTPC_USER_FSM_ENABLE | OTPC_USER_FSM_ENABLE_MASK,
+ otp->base + OTPC_USER_ENABLE);
+ ret = rockchip_otp_wait_status(otp, OTPC_USER_DONE);
+ if (ret < 0) {
+ printf("%s timeout during read setup\n", __func__);
+ goto read_end;
+ }
+ *buffer++ = readb(otp->base + OTPC_USER_Q);
+ }
+
+read_end:
+ writel(0x0 | OTPC_USE_USER_MASK, otp->base + OTPC_USER_CTRL);
+
+ return ret;
+}
+
+static int rockchip_otp_read(struct udevice *dev, int offset,
+ void *buf, int size)
+{
+ OTP_READ otp_read = NULL;
+
+ otp_read = (OTP_READ)dev_get_driver_data(dev);
+ if (!otp_read)
+ return -ENOSYS;
+
+ return (*otp_read)(dev, offset, buf, size);
+}
+
+static const struct misc_ops rockchip_otp_ops = {
+ .read = rockchip_otp_read,
+};
+
+static int rockchip_otp_ofdata_to_platdata(struct udevice *dev)
+{
+ struct rockchip_otp_platdata *otp = dev_get_platdata(dev);
+
+ otp->base = dev_read_addr_ptr(dev);
+
+ return 0;
+}
+
+static const struct udevice_id rockchip_otp_ids[] = {
+ {
+ .compatible = "rockchip,px30-otp",
+ .data = (ulong)&rockchip_px30_otp_read,
+ },
+ {
+ .compatible = "rockchip,rk3308-otp",
+ .data = (ulong)&rockchip_px30_otp_read,
+ },
+ {}
+};
+
+U_BOOT_DRIVER(rockchip_otp) = {
+ .name = "rockchip_otp",
+ .id = UCLASS_MISC,
+ .of_match = rockchip_otp_ids,
+ .ops = &rockchip_otp_ops,
+ .ofdata_to_platdata = rockchip_otp_ofdata_to_platdata,
+ .platdata_auto_alloc_size = sizeof(struct rockchip_otp_platdata),
+};
diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
index 3a13b51a41..f8347f0c52 100644
--- a/drivers/mmc/dw_mmc.c
+++ b/drivers/mmc/dw_mmc.c
@@ -13,6 +13,10 @@
#include <memalign.h>
#include <mmc.h>
#include <dwmmc.h>
+#ifdef CONFIG_DM_GPIO
+#include <asm/gpio.h>
+#include <asm-generic/gpio.h>
+#endif
#define PAGE_SIZE 4096
@@ -580,8 +584,16 @@ static int dwmci_init(struct mmc *mmc)
if (host->board_init)
host->board_init(host);
-
+#ifdef CONFIG_ARCH_ROCKCHIP
+ if (host->dev_index == 0)
+ dwmci_writel(host, DWMCI_PWREN, 1);
+ else if (host->dev_index == 1)
+ dwmci_writel(host, DWMCI_PWREN, 0);
+ else
+ dwmci_writel(host, DWMCI_PWREN, 1);
+#else
dwmci_writel(host, DWMCI_PWREN, 1);
+#endif
if (!dwmci_wait_reset(host, DWMCI_RESET_ALL)) {
debug("%s[%d] Fail-reset!!\n", __func__, __LINE__);
@@ -623,6 +635,24 @@ static int dwmci_init(struct mmc *mmc)
return 0;
}
+static int dwmci_get_cd(struct udevice *dev)
+{
+ int ret = -1;
+#ifndef CONFIG_SPL_BUILD
+#ifdef CONFIG_DM_GPIO
+ struct gpio_desc detect;
+
+ ret = gpio_request_by_name(dev, "cd-gpios", 0, &detect, GPIOD_IS_IN);
+ if (ret) {
+ return ret;
+ }
+
+ ret = !dm_gpio_get_value(&detect);
+#endif
+#endif
+ return ret;
+}
+
#ifdef CONFIG_DM_MMC
int dwmci_probe(struct udevice *dev)
{
@@ -635,6 +665,7 @@ const struct dm_mmc_ops dm_dwmci_ops = {
.card_busy = dwmci_card_busy,
.send_cmd = dwmci_send_cmd,
.set_ios = dwmci_set_ios,
+ .get_cd = dwmci_get_cd,
.execute_tuning = dwmci_execute_tuning,
};
@@ -643,6 +674,7 @@ static const struct mmc_ops dwmci_ops = {
.card_busy = dwmci_card_busy,
.send_cmd = dwmci_send_cmd,
.set_ios = dwmci_set_ios,
+ .get_cd = dwmci_get_cd,
.init = dwmci_init,
.execute_tuning = dwmci_execute_tuning,
};
diff --git a/drivers/mmc/rpmb.c b/drivers/mmc/rpmb.c
index dda84de781..88136f0644 100644
--- a/drivers/mmc/rpmb.c
+++ b/drivers/mmc/rpmb.c
@@ -84,7 +84,7 @@ static int mmc_rpmb_request(struct mmc *mmc, const void *s,
cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
cmd.cmdarg = 0;
- cmd.resp_type = MMC_RSP_R1b;
+ cmd.resp_type = MMC_RSP_R1;
data.src = (const char *)s;
data.blocks = count;
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index b43d86d050..f3372d65f7 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -79,9 +79,17 @@ config NAND_PXA3XX
config NAND_ROCKCHIP
bool "Support for NAND on Rockchip SoCs"
select SYS_NAND_SELF_INIT
+ default n
---help---
Enable support for Rockchip nand.
+config NAND_ROCKCHIP_V9
+ bool "Support for NAND V9 on Rockchip SoCs"
+ select SYS_NAND_SELF_INIT
+ default n
+ ---help---
+ Enable support for Rockchip nand v9.
+
config NAND_SUNXI
bool "Support for NAND on Allwinner SoCs"
depends on MACH_SUN4I || MACH_SUN5I || MACH_SUN7I
diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile
index 6067b89837..de8675d227 100644
--- a/drivers/mtd/nand/Makefile
+++ b/drivers/mtd/nand/Makefile
@@ -70,7 +70,7 @@ obj-$(CONFIG_NAND_PLAT) += nand_plat.o
obj-$(CONFIG_NAND_SUNXI) += sunxi_nand.o
obj-$(CONFIG_NAND_ZYNQ) += zynq_nand.o
obj-$(CONFIG_NAND_ROCKCHIP) += rockchip_nand.o
-
+obj-$(CONFIG_NAND_ROCKCHIP_V9) += rockchip_nand_v9.o
else # minimal SPL drivers
obj-$(CONFIG_NAND_FSL_ELBC) += fsl_elbc_spl.o
diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
index 74c4c9a3c8..aa4cf30c3f 100644
--- a/drivers/mtd/nand/nand_bbt.c
+++ b/drivers/mtd/nand/nand_bbt.c
@@ -487,8 +487,10 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
int ret;
BUG_ON(bd->options & NAND_BBT_NO_OOB);
-
- ret = scan_block_fast(mtd, bd, from, buf, numpages);
+ if (this->block_bad)
+ ret = this->block_bad(mtd, from);
+ else
+ ret = scan_block_fast(mtd, bd, from, buf, numpages);
if (ret < 0)
return ret;
diff --git a/drivers/mtd/nand/rockchip_nand.c b/drivers/mtd/nand/rockchip_nand.c
index d8f443972a..b8607c82ee 100644
--- a/drivers/mtd/nand/rockchip_nand.c
+++ b/drivers/mtd/nand/rockchip_nand.c
@@ -307,7 +307,6 @@ static void rockchip_nand_write_extra_oob(struct mtd_info *mtd, u8 *oob)
rockchip_nand_write_buf(mtd, oob + offset, len);
}
-
static int rockchip_nand_hw_syndrome_pio_read_page(struct mtd_info *mtd,
struct nand_chip *chip,
uint8_t *buf,
@@ -535,6 +534,33 @@ static int rockchip_nand_ecc_init(struct mtd_info *mtd,
return 0;
}
+static int rockchip_nand_block_bad(struct mtd_info *mtd, loff_t ofs)
+{
+ int page, res = 0, i;
+ struct nand_chip *chip = mtd_to_nand(mtd);
+ u16 bad = 0xff;
+ int chipnr = (int)(ofs >> chip->chip_shift);
+
+ page = (int)(ofs >> chip->page_shift) & chip->pagemask;
+ chip->select_chip(mtd, chipnr);
+ chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
+ if(rockchip_nand_hw_syndrome_pio_read_page(mtd,
+ chip, chip->buffers->databuf, 0, page) == -1) {
+ chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, page);
+ for (i = 0; i < 8; i++) {
+ bad = chip->read_byte(mtd);
+ if (bad)
+ break;
+ }
+ if (i >= 8)
+ res = 1;
+ }
+ chip->select_chip(mtd, -1);
+ if (res)
+ printf("%s 0x%x %x %x\n", __func__, page, res, bad);
+ return res;
+}
+
static int rockchip_nand_chip_init(int node, struct rk_nand *rknand, int devnum)
{
const void *blob = gd->fdt_blob;
@@ -553,6 +579,9 @@ static int rockchip_nand_chip_init(int node, struct rk_nand *rknand, int devnum)
chip->read_byte = rockchip_nand_read_byte;
chip->dev_ready = rockchip_nand_dev_ready;
chip->controller = &rknand->controller;
+ chip->block_bad = rockchip_nand_block_bad;
+ chip->bbt_options = NAND_BBT_USE_FLASH | NAND_BBT_NO_OOB;
+ chip->options = NAND_NO_SUBPAGE_WRITE;
rknand->banks[devnum] = fdtdec_get_int(blob, node, "reg", -1);
@@ -625,7 +654,7 @@ void board_nand_init(void)
goto err;
}
- regs = fdtdec_get_addr(blob, node, "reg");
+ regs = fdt_get_base_address(blob, node);
if (regs == FDT_ADDR_T_NONE) {
debug("Nand address not found\n");
goto err;
@@ -652,9 +681,10 @@ err:
int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst)
{
struct mtd_info *mtd;
+ size_t length = size;
mtd = get_nand_dev_by_index(0);
- return nand_read_skip_bad(mtd, offs, &size, NULL, size, (u_char *)dst);
+ return nand_read_skip_bad(mtd, offs, &length, NULL, size, (u_char *)dst);
}
void nand_deselect(void) {}
diff --git a/drivers/mtd/nand/rockchip_nand_v9.c b/drivers/mtd/nand/rockchip_nand_v9.c
new file mode 100644
index 0000000000..b2ff609d33
--- /dev/null
+++ b/drivers/mtd/nand/rockchip_nand_v9.c
@@ -0,0 +1,691 @@
+/*
+ * Copyright (c) 2017 Yifeng Zhao <yifeng.zhao@rock-chips.com>
+ * Copyright (c) 2017 Paweł Jarosz <paweljarosz3691@gmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <inttypes.h>
+#include <nand.h>
+#include <linux/kernel.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/partitions.h>
+#include <linux/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define NANDC_V9_BOOTROM_ECC 70
+#define NANDC_V9_NUM_BANKS 4
+#define NANDC_V9_DEF_TIMEOUT 20000
+#define NANDC_V9_READ 0
+#define NANDC_V9_WRITE 1
+#define NANDC_REG_V9_FMCTL 0x00
+#define NANDC_REG_V9_FMWAIT 0x04
+#define NANDC_REG_V9_FLCTL 0x10
+#define NANDC_REG_V9_BCHCTL 0x20
+#define NANDC_REG_V9_DMA_CFG 0x30
+#define NANDC_REG_V9_DMA_BUF0 0x34
+#define NANDC_REG_V9_DMA_BUF1 0x38
+#define NANDC_REG_V9_DMA_ST 0x40
+#define NANDC_REG_V9_VER 0x80
+#define NANDC_REG_V9_INTEN 0x120
+#define NANDC_REG_V9_INTCLR 0x124
+#define NANDC_REG_V9_INTST 0x128
+#define NANDC_REG_V9_BCHST 0x150
+#define NANDC_REG_V9_SPARE0 0x200
+#define NANDC_REG_V9_SPARE1 0x204
+#define NANDC_REG_V9_RANDMZ 0x208
+#define NANDC_REG_V9_BANK0 0x800
+#define NANDC_REG_V9_SRAM0 0x1000
+#define NANDC_REG_V9_SRAM_SIZE 0x400
+
+#define NANDC_REG_V9_DATA 0x00
+#define NANDC_REG_V9_ADDR 0x04
+#define NANDC_REG_V9_CMD 0x08
+
+/* FMCTL */
+#define NANDC_V9_FM_WP BIT(8)
+#define NANDC_V9_FM_CE_SEL_M 0xFF
+#define NANDC_V9_FM_CE_SEL(x) (1 << (x))
+#define NANDC_V9_FM_FREADY BIT(9)
+
+/* FLCTL */
+#define NANDC_V9_FL_RST BIT(0)
+#define NANDC_V9_FL_DIR_S 0x1
+#define NANDC_V9_FL_XFER_START BIT(2)
+#define NANDC_V9_FL_XFER_EN BIT(3)
+#define NANDC_V9_FL_ST_BUF_S 0x4
+#define NANDC_V9_FL_XFER_COUNT BIT(5)
+#define NANDC_V9_FL_ACORRECT BIT(10)
+#define NANDC_V9_FL_XFER_READY BIT(20)
+
+/* BCHCTL */
+#define NAND_V9_BCH_MODE_S 25
+#define NAND_V9_BCH_MODE_M 0x7
+
+/* BCHST */
+#define NANDC_V9_BCH0_ST_ERR BIT(2)
+#define NANDC_V9_BCH1_ST_ERR BIT(18)
+#define NANDC_V9_ECC_ERR_CNT0(x) (((x) & (0x7F << 3)) >> 3)
+#define NANDC_V9_ECC_ERR_CNT1(x) (((x) & (0x7F << 19)) >> 19)
+
+struct rk_nand {
+ uint32_t banks[NANDC_V9_NUM_BANKS];
+ struct nand_hw_control controller;
+ uint32_t ecc_strength;
+ uint32_t max_ecc_strength;
+ struct mtd_info mtd;
+ bool bootromblocks;
+ void __iomem *regs;
+ int selected_bank;
+};
+
+static struct nand_ecclayout nand_oob_fix = {
+ .eccbytes = 24,
+ .eccpos = {
+ 4, 5, 6, 7, 8, 9, 10
+ },
+ .oobfree = {
+ {
+ .offset = 0,
+ .length = 4
+ }
+ }
+};
+
+static inline struct rk_nand *to_rknand(struct nand_hw_control *ctrl)
+{
+ return container_of(ctrl, struct rk_nand, controller);
+}
+
+static void rockchip_nand_init(struct rk_nand *rknand)
+{
+ writel(0, rknand->regs + NANDC_REG_V9_RANDMZ);
+ writel(0, rknand->regs + NANDC_REG_V9_DMA_CFG);
+ writel(0, rknand->regs + NANDC_REG_V9_BCHCTL);
+ writel(NANDC_V9_FM_WP, rknand->regs + NANDC_REG_V9_FMCTL);
+ writel(0x1081, rknand->regs + NANDC_REG_V9_FMWAIT);
+}
+
+static void rockchip_nand_select_chip(struct mtd_info *mtd, int chipnr)
+{
+ struct nand_chip *chip = mtd_to_nand(mtd);
+ struct rk_nand *rknand = to_rknand(chip->controller);
+ void __iomem *bank_base;
+ uint32_t reg;
+ int banknr;
+
+ reg = readl(rknand->regs + NANDC_REG_V9_FMCTL);
+ reg &= ~NANDC_V9_FM_CE_SEL_M;
+
+ if (chipnr == -1) {
+ banknr = -1;
+ } else {
+ banknr = rknand->banks[chipnr];
+ bank_base = rknand->regs + NANDC_REG_V9_BANK0 + banknr * 0x100;
+
+ chip->IO_ADDR_R = bank_base;
+ chip->IO_ADDR_W = bank_base;
+
+ reg |= 1 << banknr;
+ }
+ writel(reg, rknand->regs + NANDC_REG_V9_FMCTL);
+
+ rknand->selected_bank = banknr;
+}
+
+static void rockchip_nand_cmd_ctrl(struct mtd_info *mtd,
+ int dat,
+ unsigned int ctrl)
+{
+ struct nand_chip *chip = mtd_to_nand(mtd);
+ struct rk_nand *rknand = to_rknand(chip->controller);
+ void __iomem *bank_base = rknand->regs + NANDC_REG_V9_BANK0
+ + rknand->selected_bank * 0x100;
+
+ if (ctrl & NAND_CTRL_CHANGE) {
+ if (ctrl & NAND_ALE)
+ bank_base += NANDC_REG_V9_ADDR;
+ else if (ctrl & NAND_CLE)
+ bank_base += NANDC_REG_V9_CMD;
+ chip->IO_ADDR_W = bank_base;
+ }
+
+ if (dat != NAND_CMD_NONE)
+ writeb(dat & 0xFF, chip->IO_ADDR_W);
+}
+
+static void rockchip_nand_read_buf(struct mtd_info *mtd,
+ uint8_t *buf,
+ int len)
+{
+ struct nand_chip *chip = mtd_to_nand(mtd);
+ struct rk_nand *rknand = to_rknand(chip->controller);
+ int offs = 0;
+ void __iomem *bank_base = rknand->regs + NANDC_REG_V9_BANK0
+ + rknand->selected_bank * 0x100;
+
+ for (offs = 0; offs < len; offs++)
+ buf[offs] = readb(bank_base);
+}
+
+static void rockchip_nand_write_buf(struct mtd_info *mtd,
+ const uint8_t *buf,
+ int len)
+{
+ struct nand_chip *chip = mtd_to_nand(mtd);
+ struct rk_nand *rknand = to_rknand(chip->controller);
+ int offs = 0;
+ void __iomem *bank_base = rknand->regs + NANDC_REG_V9_BANK0
+ + rknand->selected_bank * 0x100;
+
+ for (offs = 0; offs < len; offs++)
+ writeb(buf[offs], bank_base);
+}
+
+static uint8_t rockchip_nand_read_byte(struct mtd_info *mtd)
+{
+ uint8_t ret;
+
+ rockchip_nand_read_buf(mtd, &ret, 1);
+
+ return ret;
+}
+
+static int rockchip_nand_dev_ready(struct mtd_info *mtd)
+{
+ struct nand_chip *chip = mtd_to_nand(mtd);
+ struct rk_nand *rknand = to_rknand(chip->controller);
+
+ if (readl(rknand->regs + NANDC_REG_V9_FMCTL) & NANDC_V9_FM_FREADY)
+ return 1;
+
+ return 0;
+}
+
+static int rockchip_nand_hw_ecc_setup(struct mtd_info *mtd,
+ struct nand_ecc_ctrl *ecc,
+ uint32_t strength)
+{
+ struct nand_chip *chip = mtd_to_nand(mtd);
+ struct rk_nand *rknand = to_rknand(chip->controller);
+ u32 reg;
+
+ ecc->strength = strength;
+ ecc->bytes = DIV_ROUND_UP(ecc->strength * 14, 8);
+ ecc->bytes = ALIGN(ecc->bytes, 2);
+
+ switch (ecc->strength) {
+ case 70:
+ reg = 0x00000001;
+ break;
+ case 60:
+ reg = 0x06000001;
+ break;
+ case 40:
+ reg = 0x04000001;
+ break;
+ case 16:
+ reg = 0x02000001;
+ break;
+ default:
+ return -EINVAL;
+ }
+ writel(reg, rknand->regs + NANDC_REG_V9_BCHCTL);
+
+ return 0;
+}
+
+static void rockchip_nand_pio_xfer_start(struct rk_nand *rknand,
+ u8 dir,
+ u8 st_buf)
+{
+ u32 reg;
+
+ reg = (dir << NANDC_V9_FL_DIR_S) | (st_buf << NANDC_V9_FL_ST_BUF_S) |
+ NANDC_V9_FL_XFER_EN | NANDC_V9_FL_XFER_COUNT |
+ NANDC_V9_FL_ACORRECT;
+ writel(reg, rknand->regs + NANDC_REG_V9_FLCTL);
+
+ reg |= NANDC_V9_FL_XFER_START;
+ writel(reg, rknand->regs + NANDC_REG_V9_FLCTL);
+}
+
+static int rockchip_nand_wait_pio_xfer_done(struct rk_nand *rknand)
+{
+ int timeout = NANDC_V9_DEF_TIMEOUT;
+ int reg;
+
+ while (timeout--) {
+ reg = readl(rknand->regs + NANDC_REG_V9_FLCTL);
+
+ if ((reg & NANDC_V9_FL_XFER_READY) != 0)
+ break;
+
+ udelay(1);
+ }
+
+ if (timeout == 0)
+ return -1;
+
+ return 0;
+}
+
+static void rockchip_nand_read_extra_oob(struct mtd_info *mtd, u8 *oob)
+{
+ struct nand_chip *chip = mtd_to_nand(mtd);
+ struct nand_ecc_ctrl *ecc = &chip->ecc;
+ int offset = ((ecc->bytes + ecc->prepad) * ecc->steps);
+ int len = mtd->oobsize - offset;
+
+ if (len <= 0)
+ return;
+
+ chip->cmdfunc(mtd, NAND_CMD_RNDOUT, offset + mtd->writesize, -1);
+
+ rockchip_nand_read_buf(mtd, oob + offset, len);
+}
+
+static void rockchip_nand_write_extra_oob(struct mtd_info *mtd, u8 *oob)
+{
+ struct nand_chip *chip = mtd_to_nand(mtd);
+ struct nand_ecc_ctrl *ecc = &chip->ecc;
+ int offset = ((ecc->bytes + ecc->prepad) * ecc->steps);
+ int len = mtd->oobsize - offset;
+
+ if (len <= 0)
+ return;
+
+ chip->cmdfunc(mtd, NAND_CMD_RNDIN, offset + mtd->writesize, -1);
+
+ rockchip_nand_write_buf(mtd, oob + offset, len);
+}
+
+static int rockchip_nand_hw_syndrome_pio_read_page(struct mtd_info *mtd,
+ struct nand_chip *chip,
+ uint8_t *buf,
+ int oob_required,
+ int page)
+{
+ struct rk_nand *rknand = to_rknand(chip->controller);
+ struct nand_ecc_ctrl *ecc = &chip->ecc;
+ void __iomem *sram_base = rknand->regs + NANDC_REG_V9_SRAM0;
+ unsigned int max_bitflips = 0;
+ int ret, step, bch_st;
+ int offset = page * mtd->writesize;
+
+ if (rknand->bootromblocks && (offset < (4 * mtd->erasesize)))
+ rockchip_nand_hw_ecc_setup(mtd, ecc, NANDC_V9_BOOTROM_ECC);
+
+ rockchip_nand_pio_xfer_start(rknand, NANDC_V9_READ, 0);
+
+ for (step = 0; step < ecc->steps; step++) {
+ int data_off = step * ecc->size;
+ int oob_off = step * (ecc->bytes + ecc->prepad);
+ u8 *data = buf + data_off;
+ u8 *oob = chip->oob_poi + oob_off;
+
+ ret = rockchip_nand_wait_pio_xfer_done(rknand);
+ if (ret)
+ return ret;
+
+ bch_st = readl(rknand->regs + NANDC_REG_V9_BCHST);
+
+ if (bch_st & NANDC_V9_BCH0_ST_ERR) {
+ mtd->ecc_stats.failed++;
+ max_bitflips = -1;
+ } else {
+ ret = NANDC_V9_ECC_ERR_CNT0(bch_st);
+ mtd->ecc_stats.corrected += ret;
+ max_bitflips = max_t(unsigned int, max_bitflips, ret);
+ }
+
+ if ((step + 1) < ecc->steps)
+ rockchip_nand_pio_xfer_start(rknand, NANDC_V9_READ,
+ (step + 1) & 0x1);
+
+ memcpy_fromio(data, sram_base + NANDC_REG_V9_SRAM_SIZE *
+ (step & 1), ecc->size);
+
+ if (step & 1)
+ memcpy_fromio(oob, rknand->regs + NANDC_REG_V9_SPARE1, 4);
+ else
+ memcpy_fromio(oob, rknand->regs + NANDC_REG_V9_SPARE0, 4);
+ }
+
+ rockchip_nand_read_extra_oob(mtd, chip->oob_poi);
+
+ if (rknand->bootromblocks)
+ rockchip_nand_hw_ecc_setup(mtd, ecc, rknand->ecc_strength);
+
+ return max_bitflips;
+}
+
+static uint32_t rockchip_nand_make_bootrom_compat(struct mtd_info *mtd,
+ int page,
+ const u8 *oob,
+ bool bootromblocks)
+{
+ int pages_per_block = mtd->erasesize / mtd->writesize;
+ int offset = page * mtd->writesize;
+
+ if ((offset < (2 * mtd->erasesize)) || !(page % 2) ||
+ (offset >= (7 * mtd->erasesize)) || !bootromblocks)
+ return oob[3] | (oob[2] << 8) | (oob[1] << 16) | (oob[0] << 24);
+
+ return (page % pages_per_block + 1) * 4;
+}
+
+static int rockchip_nand_hw_syndrome_pio_write_page(struct mtd_info *mtd,
+ struct nand_chip *chip,
+ const uint8_t *buf,
+ int oob_required,
+ int page)
+{
+ struct rk_nand *rknand = to_rknand(chip->controller);
+ struct nand_ecc_ctrl *ecc = &chip->ecc;
+ void __iomem *sram_base = rknand->regs + NANDC_REG_V9_SRAM0;
+ int ret, index, step = 0;
+ int offset = page * mtd->writesize;
+ int data_off = step * ecc->size;
+ int oob_off = step * (ecc->bytes + ecc->prepad);
+ const u8 *data = buf + data_off;
+ const u8 *oob = chip->oob_poi + oob_off;
+
+ if (rknand->bootromblocks && (offset < (7 * mtd->erasesize)))
+ rockchip_nand_hw_ecc_setup(mtd, ecc, NANDC_V9_BOOTROM_ECC);
+
+ index = rockchip_nand_make_bootrom_compat(mtd, page, oob,
+ rknand->bootromblocks);
+
+ memcpy_toio(sram_base, data, ecc->size);
+ memcpy_toio(rknand->regs + NANDC_REG_V9_SPARE0, &index, ecc->prepad);
+
+ for (step = 1; step <= ecc->steps; step++) {
+ rockchip_nand_pio_xfer_start(rknand, NANDC_V9_WRITE,
+ (step - 1) & 0x1);
+ data_off = step * ecc->size;
+ oob_off = step * (ecc->bytes + ecc->prepad);
+ data = buf + data_off;
+ oob = chip->oob_poi + oob_off;
+
+ if (step < ecc->steps) {
+ memcpy_toio(sram_base + NANDC_REG_V9_SRAM_SIZE *
+ (step & 1), data, ecc->size);
+ if (step & 1)
+ memcpy_toio(rknand->regs + NANDC_REG_V9_SPARE1,
+ oob, ecc->prepad);
+ else
+ memcpy_toio(rknand->regs + NANDC_REG_V9_SPARE0,
+ oob, ecc->prepad);
+ }
+
+ ret = rockchip_nand_wait_pio_xfer_done(rknand);
+ if (ret)
+ return ret;
+ }
+
+ rockchip_nand_write_extra_oob(mtd, chip->oob_poi);
+
+ if (rknand->bootromblocks)
+ rockchip_nand_hw_ecc_setup(mtd, ecc, rknand->ecc_strength);
+
+ return 0;
+}
+
+static const u8 strengths[] = {70, 60, 40, 16};
+
+static int rockchip_nand_ecc_max_strength(struct mtd_info *mtd,
+ struct nand_ecc_ctrl *ecc)
+{
+ uint32_t max_strength, index;
+
+ max_strength = ((mtd->oobsize / ecc->steps) - ecc->prepad) * 8 / 14;
+
+ for (index = 0; index < ARRAY_SIZE(strengths); index++)
+ if (max_strength >= strengths[index])
+ break;
+
+ if (index >= ARRAY_SIZE(strengths))
+ return -ENOTSUPP;
+
+ return strengths[index];
+}
+
+static bool rockchip_nand_strength_is_valid(int strength)
+{
+ uint32_t index;
+
+ for (index = 0; index < ARRAY_SIZE(strengths); index++)
+ if (strength == strengths[index])
+ break;
+
+ if (index == ARRAY_SIZE(strengths))
+ return false;
+
+ return true;
+}
+
+static int rockchip_nand_hw_ecc_ctrl_init(struct mtd_info *mtd,
+ struct nand_ecc_ctrl *ecc)
+{
+ struct nand_chip *chip = mtd_to_nand(mtd);
+ struct rk_nand *rknand = to_rknand(chip->controller);
+ uint32_t strength;
+ int index;
+
+ ecc->prepad = 4;
+ ecc->steps = mtd->writesize / ecc->size;
+
+ if (fdtdec_get_bool(gd->fdt_blob, chip->flash_node,
+ "rockchip,protect-bootrom-blocks"))
+ rknand->bootromblocks = true;
+ else
+ rknand->bootromblocks = false;
+
+ if (rockchip_nand_strength_is_valid(ecc->strength))
+ strength = ecc->strength;
+ else
+ strength = rockchip_nand_ecc_max_strength(mtd, ecc);
+
+ rknand->max_ecc_strength = 70;
+ if (strength > rknand->max_ecc_strength)
+ strength = rknand->max_ecc_strength;
+
+ rockchip_nand_hw_ecc_setup(mtd, ecc, strength);
+
+ rknand->ecc_strength = ecc->strength;
+
+ nand_oob_fix.eccbytes = ecc->bytes * ecc->steps;
+ for (index = 0; index < ecc->bytes; index++)
+ nand_oob_fix.eccpos[index] = index + ecc->prepad;
+ ecc->layout = &nand_oob_fix;
+
+ if (mtd->oobsize < ((ecc->bytes + ecc->prepad) * ecc->steps)) {
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int rockchip_nand_ecc_init(struct mtd_info *mtd,
+ struct nand_ecc_ctrl *ecc)
+{
+ int ret;
+
+ switch (ecc->mode) {
+ case NAND_ECC_HW_SYNDROME:
+ ret = rockchip_nand_hw_ecc_ctrl_init(mtd, ecc);
+ if (ret)
+ return ret;
+ ecc->read_page = rockchip_nand_hw_syndrome_pio_read_page;
+ ecc->write_page = rockchip_nand_hw_syndrome_pio_write_page;
+ break;
+ case NAND_ECC_SOFT_BCH:
+ case NAND_ECC_NONE:
+ case NAND_ECC_SOFT:
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int rockchip_nand_block_bad(struct mtd_info *mtd, loff_t ofs)
+{
+ int page, res = 0, i;
+ struct nand_chip *chip = mtd_to_nand(mtd);
+ u16 bad = 0xff;
+ int chipnr = (int)(ofs >> chip->chip_shift);
+
+ page = (int)(ofs >> chip->page_shift) & chip->pagemask;
+ chip->select_chip(mtd, chipnr);
+ chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
+ if(rockchip_nand_hw_syndrome_pio_read_page(mtd,
+ chip, chip->buffers->databuf, 0, page) == -1) {
+ chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, page);
+ for (i = 0; i < 8; i++) {
+ bad = chip->read_byte(mtd);
+ if (bad)
+ break;
+ }
+ if (i >= 8)
+ res = 1;
+ }
+ chip->select_chip(mtd, -1);
+ if (res)
+ printf("%s 0x%x %x %x\n", __func__, page, res, bad);
+ return res;
+}
+
+static int rockchip_nand_chip_init(int node, struct rk_nand *rknand, int devnum)
+{
+ const void *blob = gd->fdt_blob;
+ struct nand_chip *chip;
+ struct mtd_info *mtd;
+ int ret;
+
+ chip = kzalloc(sizeof(*chip), GFP_KERNEL);
+
+ chip->chip_delay = 50;
+ chip->flash_node = node;
+ chip->select_chip = rockchip_nand_select_chip;
+ chip->cmd_ctrl = rockchip_nand_cmd_ctrl;
+ chip->read_buf = rockchip_nand_read_buf;
+ chip->write_buf = rockchip_nand_write_buf;
+ chip->read_byte = rockchip_nand_read_byte;
+ chip->dev_ready = rockchip_nand_dev_ready;
+ chip->controller = &rknand->controller;
+ chip->block_bad = rockchip_nand_block_bad;
+ chip->bbt_options = NAND_BBT_USE_FLASH | NAND_BBT_NO_OOB;
+ chip->options = NAND_NO_SUBPAGE_WRITE;
+
+ rknand->banks[devnum] = fdtdec_get_int(blob, node, "reg", -1);
+
+ if (rknand->banks[devnum] < 0)
+ return -EINVAL;
+
+ mtd = nand_to_mtd(chip);
+ mtd->name = "rknand";
+
+ ret = nand_scan_ident(mtd, 1, NULL);
+ if (ret)
+ return ret;
+
+ ret = rockchip_nand_ecc_init(mtd, &chip->ecc);
+ if (ret) {
+ debug("rockchip_nand_ecc_init failed: %d\n", ret);
+ return ret;
+ }
+
+ ret = nand_scan_tail(mtd);
+ if (ret) {
+ debug("nand_scan_tail failed: %d\n", ret);
+ return ret;
+ }
+
+ ret = nand_register(devnum, mtd);
+ if (ret) {
+ debug("Failed to register mtd device: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int rockchip_nand_chips_init(int node, struct rk_nand *rknand)
+{
+ const void *blob = gd->fdt_blob;
+ int nand_node;
+ int ret, i = 0;
+
+ for (nand_node = fdt_first_subnode(blob, node); nand_node >= 0;
+ nand_node = fdt_next_subnode(blob, nand_node)) {
+ ret = rockchip_nand_chip_init(nand_node, rknand, i++);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+void board_nand_init(void)
+{
+ const void *blob = gd->fdt_blob;
+ struct rk_nand *rknand;
+ fdt_addr_t regs;
+ int node;
+ int ret;
+
+ rknand = kzalloc(sizeof(*rknand), GFP_KERNEL);
+
+ node = fdtdec_next_compatible(blob, 0, COMPAT_ROCKCHIP_NANDC);
+
+ if (node < 0) {
+ debug("Nand node not found\n");
+ goto err;
+ }
+
+ if (!fdtdec_get_is_enabled(blob, node)) {
+ debug("Nand disabled in device tree\n");
+ goto err;
+ }
+
+ regs = fdt_get_base_address(blob, node);
+ if (regs == FDT_ADDR_T_NONE) {
+ debug("Nand address not found\n");
+ goto err;
+ }
+
+ rknand->regs = (void *)regs;
+
+ spin_lock_init(&rknand->controller.lock);
+ init_waitqueue_head(&rknand->controller.wq);
+
+ rockchip_nand_init(rknand);
+
+ ret = rockchip_nand_chips_init(node, rknand);
+ if (ret) {
+ debug("Failed to init nand chips\n");
+ goto err;
+ }
+
+ return;
+err:
+ kfree(rknand);
+}
+
+int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst)
+{
+ struct mtd_info *mtd;
+ size_t length = size;
+
+ mtd = get_nand_dev_by_index(0);
+ return nand_read_skip_bad(mtd, offs, &length, NULL, size, (u_char *)dst);
+}
+
+void nand_deselect(void) {}
diff --git a/drivers/net/gmac_rockchip.c b/drivers/net/gmac_rockchip.c
index 172d423e2e..9007e4cdac 100644
--- a/drivers/net/gmac_rockchip.c
+++ b/drivers/net/gmac_rockchip.c
@@ -15,8 +15,11 @@
#include <asm/arch/periph.h>
#include <asm/arch/clock.h>
#include <asm/arch/hardware.h>
+#include <asm/arch/grf_px30.h>
+#include <asm/arch/grf_rk1808.h>
#include <asm/arch/grf_rk322x.h>
#include <asm/arch/grf_rk3288.h>
+#include <asm/arch/grf_rk3308.h>
#include <asm/arch/grf_rk3328.h>
#include <asm/arch/grf_rk3368.h>
#include <asm/arch/grf_rk3399.h>
@@ -81,6 +84,81 @@ static int gmac_rockchip_ofdata_to_platdata(struct udevice *dev)
return designware_eth_ofdata_to_platdata(dev);
}
+static int px30_gmac_fix_mac_speed(struct dw_eth_dev *priv)
+{
+ struct px30_grf *grf;
+ struct clk clk_speed;
+ int speed, ret;
+ enum {
+ PX30_GMAC_SPEED_SHIFT = 0x2,
+ PX30_GMAC_SPEED_MASK = BIT(2),
+ PX30_GMAC_SPEED_10M = 0,
+ PX30_GMAC_SPEED_100M = BIT(2),
+ };
+
+ ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
+ &clk_speed);
+ if (ret)
+ return ret;
+
+ switch (priv->phydev->speed) {
+ case 10:
+ speed = PX30_GMAC_SPEED_10M;
+ ret = clk_set_rate(&clk_speed, 2500000);
+ if (ret)
+ return ret;
+ break;
+ case 100:
+ speed = PX30_GMAC_SPEED_100M;
+ ret = clk_set_rate(&clk_speed, 25000000);
+ if (ret)
+ return ret;
+ break;
+ default:
+ debug("Unknown phy speed: %d\n", priv->phydev->speed);
+ return -EINVAL;
+ }
+
+ grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+ rk_clrsetreg(&grf->mac_con1, PX30_GMAC_SPEED_MASK, speed);
+
+ return 0;
+}
+
+static int rk1808_gmac_fix_mac_speed(struct dw_eth_dev *priv)
+{
+ struct clk clk_speed;
+ int ret;
+
+ ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
+ &clk_speed);
+ if (ret)
+ return ret;
+
+ switch (priv->phydev->speed) {
+ case 10:
+ ret = clk_set_rate(&clk_speed, 2500000);
+ if (ret)
+ return ret;
+ break;
+ case 100:
+ ret = clk_set_rate(&clk_speed, 25000000);
+ if (ret)
+ return ret;
+ break;
+ case 1000:
+ ret = clk_set_rate(&clk_speed, 125000000);
+ if (ret)
+ return ret;
+ break;
+ default:
+ debug("Unknown phy speed: %d\n", priv->phydev->speed);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
static int rk3228_gmac_fix_mac_speed(struct dw_eth_dev *priv)
{
struct rk322x_grf *grf;
@@ -140,6 +218,47 @@ static int rk3288_gmac_fix_mac_speed(struct dw_eth_dev *priv)
return 0;
}
+static int rk3308_gmac_fix_mac_speed(struct dw_eth_dev *priv)
+{
+ struct rk3308_grf *grf;
+ struct clk clk_speed;
+ int speed, ret;
+ enum {
+ RK3308_GMAC_SPEED_SHIFT = 0x0,
+ RK3308_GMAC_SPEED_MASK = BIT(0),
+ RK3308_GMAC_SPEED_10M = 0,
+ RK3308_GMAC_SPEED_100M = BIT(0),
+ };
+
+ ret = clk_get_by_name(priv->phydev->dev, "clk_mac_speed",
+ &clk_speed);
+ if (ret)
+ return ret;
+
+ switch (priv->phydev->speed) {
+ case 10:
+ speed = RK3308_GMAC_SPEED_10M;
+ ret = clk_set_rate(&clk_speed, 2500000);
+ if (ret)
+ return ret;
+ break;
+ case 100:
+ speed = RK3308_GMAC_SPEED_100M;
+ ret = clk_set_rate(&clk_speed, 25000000);
+ if (ret)
+ return ret;
+ break;
+ default:
+ debug("Unknown phy speed: %d\n", priv->phydev->speed);
+ return -EINVAL;
+ }
+
+ grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+ rk_clrsetreg(&grf->mac_con0, RK3308_GMAC_SPEED_MASK, speed);
+
+ return 0;
+}
+
static int rk3328_gmac_fix_mac_speed(struct dw_eth_dev *priv)
{
struct rk3328_grf_regs *grf;
@@ -266,6 +385,62 @@ static int rv1108_set_rmii_speed(struct dw_eth_dev *priv)
return 0;
}
+static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
+{
+ struct px30_grf *grf;
+ enum {
+ px30_GMAC_PHY_INTF_SEL_SHIFT = 4,
+ px30_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 6),
+ px30_GMAC_PHY_INTF_SEL_RMII = BIT(6),
+ };
+
+ grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+
+ rk_clrsetreg(&grf->mac_con1,
+ px30_GMAC_PHY_INTF_SEL_MASK,
+ px30_GMAC_PHY_INTF_SEL_RMII);
+}
+
+static void rk1808_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
+{
+ struct rk1808_grf *grf;
+ enum {
+ RK1808_GMAC_PHY_INTF_SEL_SHIFT = 4,
+ RK1808_GMAC_PHY_INTF_SEL_MASK = GENMASK(6, 4),
+ RK1808_GMAC_PHY_INTF_SEL_RGMII = BIT(4),
+
+ RK1808_RXCLK_DLY_ENA_GMAC_MASK = BIT(1),
+ RK1808_RXCLK_DLY_ENA_GMAC_DISABLE = 0,
+ RK1808_RXCLK_DLY_ENA_GMAC_ENABLE = BIT(1),
+
+ RK1808_TXCLK_DLY_ENA_GMAC_MASK = BIT(0),
+ RK1808_TXCLK_DLY_ENA_GMAC_DISABLE = 0,
+ RK1808_TXCLK_DLY_ENA_GMAC_ENABLE = BIT(0),
+ };
+ enum {
+ RK1808_CLK_RX_DL_CFG_GMAC_SHIFT = 0x8,
+ RK1808_CLK_RX_DL_CFG_GMAC_MASK = GENMASK(15, 7),
+
+ RK1808_CLK_TX_DL_CFG_GMAC_SHIFT = 0x0,
+ RK1808_CLK_TX_DL_CFG_GMAC_MASK = GENMASK(7, 0),
+ };
+
+ grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+ rk_clrsetreg(&grf->mac_con1,
+ RK1808_GMAC_PHY_INTF_SEL_MASK |
+ RK1808_RXCLK_DLY_ENA_GMAC_MASK |
+ RK1808_TXCLK_DLY_ENA_GMAC_MASK,
+ RK1808_GMAC_PHY_INTF_SEL_RGMII |
+ RK1808_RXCLK_DLY_ENA_GMAC_ENABLE |
+ RK1808_TXCLK_DLY_ENA_GMAC_ENABLE);
+
+ rk_clrsetreg(&grf->mac_con0,
+ RK1808_CLK_RX_DL_CFG_GMAC_MASK |
+ RK1808_CLK_TX_DL_CFG_GMAC_MASK,
+ pdata->rx_delay << RK1808_CLK_RX_DL_CFG_GMAC_SHIFT |
+ pdata->tx_delay << RK1808_CLK_TX_DL_CFG_GMAC_SHIFT);
+}
+
static void rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
{
struct rk322x_grf *grf;
@@ -330,6 +505,22 @@ static void rk3288_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
pdata->tx_delay << RK3288_CLK_TX_DL_CFG_GMAC_SHIFT);
}
+static void rk3308_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata)
+{
+ struct rk3308_grf *grf;
+ enum {
+ RK3308_GMAC_PHY_INTF_SEL_SHIFT = 2,
+ RK3308_GMAC_PHY_INTF_SEL_MASK = GENMASK(4, 2),
+ RK3308_GMAC_PHY_INTF_SEL_RMII = BIT(4),
+ };
+
+ grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+
+ rk_clrsetreg(&grf->mac_con0,
+ RK3308_GMAC_PHY_INTF_SEL_MASK,
+ RK3308_GMAC_PHY_INTF_SEL_RMII);
+}
+
static void rk3328_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata)
{
struct rk3328_grf_regs *grf;
@@ -542,6 +733,16 @@ const struct eth_ops gmac_rockchip_eth_ops = {
.write_hwaddr = designware_eth_write_hwaddr,
};
+const struct rk_gmac_ops px30_gmac_ops = {
+ .fix_mac_speed = px30_gmac_fix_mac_speed,
+ .set_to_rmii = px30_gmac_set_to_rmii,
+};
+
+const struct rk_gmac_ops rk1808_gmac_ops = {
+ .fix_mac_speed = rk1808_gmac_fix_mac_speed,
+ .set_to_rgmii = rk1808_gmac_set_to_rgmii,
+};
+
const struct rk_gmac_ops rk3228_gmac_ops = {
.fix_mac_speed = rk3228_gmac_fix_mac_speed,
.set_to_rgmii = rk3228_gmac_set_to_rgmii,
@@ -552,6 +753,11 @@ const struct rk_gmac_ops rk3288_gmac_ops = {
.set_to_rgmii = rk3288_gmac_set_to_rgmii,
};
+const struct rk_gmac_ops rk3308_gmac_ops = {
+ .fix_mac_speed = rk3308_gmac_fix_mac_speed,
+ .set_to_rmii = rk3308_gmac_set_to_rmii,
+};
+
const struct rk_gmac_ops rk3328_gmac_ops = {
.fix_mac_speed = rk3328_gmac_fix_mac_speed,
.set_to_rgmii = rk3328_gmac_set_to_rgmii,
@@ -573,10 +779,16 @@ const struct rk_gmac_ops rv1108_gmac_ops = {
};
static const struct udevice_id rockchip_gmac_ids[] = {
+ { .compatible = "rockchip,px30-gmac",
+ .data = (ulong)&px30_gmac_ops },
+ { .compatible = "rockchip,rk1808-gmac",
+ .data = (ulong)&rk1808_gmac_ops },
{ .compatible = "rockchip,rk3228-gmac",
.data = (ulong)&rk3228_gmac_ops },
{ .compatible = "rockchip,rk3288-gmac",
.data = (ulong)&rk3288_gmac_ops },
+ { .compatible = "rockchip,rk3308-mac",
+ .data = (ulong)&rk3308_gmac_ops },
{ .compatible = "rockchip,rk3328-gmac",
.data = (ulong)&rk3328_gmac_ops },
{ .compatible = "rockchip,rk3368-gmac",
diff --git a/drivers/power/charge_animation.c b/drivers/power/charge_animation.c
index 3a0e885689..b1a814e02b 100644
--- a/drivers/power/charge_animation.c
+++ b/drivers/power/charge_animation.c
@@ -35,7 +35,7 @@ DECLARE_GLOBAL_DATA_PTR;
#define IMAGE_RESET_IDX -1
#define IMAGE_SOC_100_IDX(n) ((n) - 2)
#define IMAGE_LOWPOWER_IDX(n) ((n) - 1)
-
+#define SYSTEM_SUSPEND_DELAY_MS 5000
#define FUEL_GAUGE_POLL_MS 1000
#define LED_CHARGING_NAME "battery_charging"
@@ -59,7 +59,8 @@ struct charge_animation_priv {
int image_num;
int auto_wakeup_key_state;
- ulong auto_screen_off_timeout;
+ ulong auto_screen_off_timeout; /* ms */
+ ulong suspend_delay_timeout; /* ms */
};
/*
@@ -170,7 +171,7 @@ static int check_key_press(struct udevice *dev)
* period timer is useless.
*/
#ifndef CONFIG_IRQ
-static int system_suspend_enter(struct charge_animation_pdata *pdata)
+static int system_suspend_enter(struct udevice *dev)
{
return 0;
}
@@ -179,8 +180,23 @@ static void autowakeup_timer_init(struct udevice *dev, uint32_t seconds) {}
static void autowakeup_timer_uninit(void) {}
#else
-static int system_suspend_enter(struct charge_animation_pdata *pdata)
+static int system_suspend_enter(struct udevice *dev)
{
+ struct charge_animation_pdata *pdata = dev_get_platdata(dev);
+ struct charge_animation_priv *priv = dev_get_priv(dev);
+
+ /*
+ * When cpu is in wfi and we try to give a long key press event without
+ * key release, cpu would wakeup and enter wfi again immediately. So
+ * here is the problem: cpu can only wakeup when long key released.
+ *
+ * Actually, we want cpu can detect long key event without key release,
+ * so we give a suspend delay timeout for cpu to detect this.
+ */
+ if (priv->suspend_delay_timeout &&
+ get_timer(priv->suspend_delay_timeout) <= SYSTEM_SUSPEND_DELAY_MS)
+ return 0;
+
if (pdata->system_suspend && IS_ENABLED(CONFIG_ARM_SMCCC)) {
printf("\nSystem suspend: ");
putc('0');
@@ -209,8 +225,11 @@ static int system_suspend_enter(struct charge_animation_pdata *pdata)
} else {
printf("\nWfi\n");
wfi();
+ putc('1');
}
+ priv->suspend_delay_timeout = get_timer(0);
+
/*
* We must wait for key release event finish, otherwise
* we may read key state too early.
@@ -362,7 +381,7 @@ static int charge_extrem_low_power(struct udevice *dev)
pdata->low_power_voltage, voltage);
/* System suspend */
- system_suspend_enter(pdata);
+ system_suspend_enter(dev);
/* Update voltage */
voltage = fuel_gauge_get_voltage(fg);
@@ -629,8 +648,7 @@ show_images:
priv->auto_screen_off_timeout = get_timer(0);
} else {
priv->auto_screen_off_timeout = 0;
-
- system_suspend_enter(pdata);
+ system_suspend_enter(dev);
}
mdelay(5);
@@ -673,14 +691,19 @@ show_images:
if (screen_on) {
charge_show_bmp(NULL); /* Turn off screen */
screen_on = false;
+ priv->suspend_delay_timeout = get_timer(0);
} else {
screen_on = true;
}
+
+ printf("screen %s\n", screen_on ? "on" : "off");
} else if (key_state == KEY_PRESS_LONG_DOWN) {
/* Set screen_on=true anyway when key long pressed */
if (!screen_on)
screen_on = true;
+ printf("screen %s\n", screen_on ? "on" : "off");
+
/* Is able to boot now ? */
if (soc < pdata->exit_charge_level) {
printf("soc=%d%%, threshold soc=%d%%\n",
diff --git a/drivers/power/dvfs/dvfs-uclass.c b/drivers/power/dvfs/dvfs-uclass.c
index abd04dcb5e..64778aaa8e 100644
--- a/drivers/power/dvfs/dvfs-uclass.c
+++ b/drivers/power/dvfs/dvfs-uclass.c
@@ -34,7 +34,8 @@ int dvfs_init(bool apply)
ret = uclass_get_device(UCLASS_DVFS, 0, &dev);
if (ret) {
- printf("DVFS: Get dvfs device failed, ret=%d\n", ret);
+ if (ret != -ENODEV)
+ printf("DVFS: Get dvfs device failed, ret=%d\n", ret);
return ret;
}
diff --git a/drivers/power/fuel_gauge/fg_rk817.c b/drivers/power/fuel_gauge/fg_rk817.c
index 57ff70e5ec..86eaf93772 100644
--- a/drivers/power/fuel_gauge/fg_rk817.c
+++ b/drivers/power/fuel_gauge/fg_rk817.c
@@ -406,9 +406,10 @@ static int rk817_bat_get_battery_voltage(struct rk817_battery_device *battery)
val |= rk817_bat_read(battery, BAT_VOL_L) << 0;
vol = battery->voltage_k * val / 1000 + battery->voltage_b;
- vol_temp = (vol * battery->bat_res_up / battery->bat_res_down + vol);
- vol = vol_temp;
-
+ if (battery->variant == RK809_ID) {
+ vol_temp = (vol * battery->bat_res_up / battery->bat_res_down + vol);
+ vol = vol_temp;
+ }
return vol;
}
diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c
index 02ea363e1a..1e5f45bfc0 100644
--- a/drivers/power/pmic/rk8xx.c
+++ b/drivers/power/pmic/rk8xx.c
@@ -13,17 +13,21 @@
DECLARE_GLOBAL_DATA_PTR;
+static struct reg_data rk817_init_reg[] = {
+/* enable the under-voltage protection,
+ * the under-voltage protection will shutdown the LDO3 and reset the PMIC
+ */
+ { RK817_BUCK4_CMIN, 0x60, 0x60},
/*
* Only when system suspend while U-Boot charge needs this config support
*/
#ifdef CONFIG_DM_CHARGE_DISPLAY
-static struct reg_data rk817_init_reg[] = {
/* Set pmic_sleep as sleep function */
{ RK817_PMIC_SYS_CFG3, 0x08, 0x18 },
/* Set pmic_int active low */
{ RK817_GPIO_INT_CFG, 0x00, 0x02 },
-};
#endif
+};
static const struct pmic_child_info pmic_children_info[] = {
{ .prefix = "DCDC", .driver = "rk8xx_buck"},
@@ -213,10 +217,8 @@ static int rk8xx_probe(struct udevice *dev)
case RK817_ID:
on_source = RK817_ON_SOURCE;
off_source = RK817_OFF_SOURCE;
-#ifdef CONFIG_DM_CHARGE_DISPLAY
init_data = rk817_init_reg;
init_data_num = ARRAY_SIZE(rk817_init_reg);
-#endif
power_en0 = pmic_reg_read(dev, RK817_POWER_EN0);
power_en1 = pmic_reg_read(dev, RK817_POWER_EN1);
power_en2 = pmic_reg_read(dev, RK817_POWER_EN2);
diff --git a/drivers/ram/Kconfig b/drivers/ram/Kconfig
index 2cf8adefb6..3139af0833 100644
--- a/drivers/ram/Kconfig
+++ b/drivers/ram/Kconfig
@@ -41,7 +41,7 @@ config DM_RAMDISK
This enables the Ramdisk uclass support. These appear as block devices
in U-Boot.
-config RAMDISK_READONLY
+config RAMDISK_RO
bool "Enable read only ramdisk support"
depends on DM_RAMDISK
help
diff --git a/drivers/ram/Makefile b/drivers/ram/Makefile
index 9d6abb0cfa..b4dd4d3293 100644
--- a/drivers/ram/Makefile
+++ b/drivers/ram/Makefile
@@ -11,4 +11,4 @@ obj-$(CONFIG_ARCH_BMIPS) += bmips_ram.o
obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
obj-$(CONFIG_DM_RAMDISK) += ramdisk-uclass.o
-obj-$(CONFIG_RAMDISK_READONLY) += ramdisk_readonly.o
+obj-$(CONFIG_RAMDISK_RO) += ramdisk_ro.o
diff --git a/drivers/ram/ramdisk_readonly.c b/drivers/ram/ramdisk_ro.c
index 7f2b3b8c7a..e2f5c29b54 100644
--- a/drivers/ram/ramdisk_readonly.c
+++ b/drivers/ram/ramdisk_ro.c
@@ -12,8 +12,8 @@
DECLARE_GLOBAL_DATA_PTR;
-static ulong ramdisk_readonly_bread(struct blk_desc *desc, lbaint_t start,
- lbaint_t blkcnt, void *dst)
+static ulong ramdisk_ro_bread(struct blk_desc *desc, lbaint_t start,
+ lbaint_t blkcnt, void *dst)
{
unsigned long b_size, b_start;
@@ -28,7 +28,7 @@ static ulong ramdisk_readonly_bread(struct blk_desc *desc, lbaint_t start,
return blkcnt;
}
-static int ramdisk_readonly_bind(struct udevice *dev)
+static int ramdisk_ro_bind(struct udevice *dev)
{
struct udevice *bdev;
int ret;
@@ -43,19 +43,19 @@ static int ramdisk_readonly_bind(struct udevice *dev)
return 0;
}
-static const struct ramdisk_ops ramdisk_readonly_ops = {
- .read = ramdisk_readonly_bread,
+static const struct ramdisk_ops ramdisk_ro_ops = {
+ .read = ramdisk_ro_bread,
};
-static const struct udevice_id ramdisk_readonly_ids[] = {
- { .compatible = "ramdisk-readonly" },
+static const struct udevice_id ramdisk_ro_ids[] = {
+ { .compatible = "ramdisk-ro" },
{ }
};
-U_BOOT_DRIVER(ramdisk_readonly) = {
- .name = "ramdisk-readonly",
+U_BOOT_DRIVER(ramdisk_ro) = {
+ .name = "ramdisk-ro",
.id = UCLASS_RAMDISK,
- .ops = &ramdisk_readonly_ops,
- .of_match = ramdisk_readonly_ids,
- .bind = ramdisk_readonly_bind,
+ .ops = &ramdisk_ro_ops,
+ .of_match = ramdisk_ro_ids,
+ .bind = ramdisk_ro_bind,
};
diff --git a/drivers/ram/rockchip/Makefile b/drivers/ram/rockchip/Makefile
index fa2b99d24c..db46f5680f 100644
--- a/drivers/ram/rockchip/Makefile
+++ b/drivers/ram/rockchip/Makefile
@@ -16,6 +16,7 @@ obj-$(CONFIG_ROCKCHIP_RK3399) += sdram_rk3399.o
obj-$(CONFIG_ROCKCHIP_PX30) += sdram_px30.o sdram_pctl_px30.o sdram_phy_px30.o
obj-$(CONFIG_ROCKCHIP_PX30) += rockchip_sdram.o
obj-$(CONFIG_ROCKCHIP_RK1808) = rockchip_sdram.o
+obj-$(CONFIG_ROCKCHIP_RV1108) += rockchip_sdram.o
obj-$(CONFIG_ROCKCHIP_RK3036) = rockchip_sdram.o
obj-$(CONFIG_ROCKCHIP_RK3308) = rockchip_sdram.o
ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),)
diff --git a/drivers/ram/rockchip/rockchip_sdram.c b/drivers/ram/rockchip/rockchip_sdram.c
index 78e15eb142..437e675e30 100644
--- a/drivers/ram/rockchip/rockchip_sdram.c
+++ b/drivers/ram/rockchip/rockchip_sdram.c
@@ -9,6 +9,7 @@
#include <syscon.h>
#include <asm/arch/clock.h>
#include <asm/arch/grf_px30.h>
+#include <asm/arch/grf_rv1108.h>
#include <asm/arch/grf_rk1808.h>
#include <asm/arch/grf_rk3036.h>
#include <asm/arch/grf_rk3308.h>
@@ -28,7 +29,13 @@ static int dmc_probe(struct udevice *dev)
struct dram_info *priv = dev_get_priv(dev);
if (!(gd->flags & GD_FLG_RELOC)) {
-#if defined(CONFIG_ROCKCHIP_RK3036)
+#if defined(CONFIG_ROCKCHIP_RV1108)
+ struct rv1108_grf *grf =
+ syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+
+ priv->info.size =
+ rockchip_sdram_size((phys_addr_t)&grf->os_reg2);
+#elif defined(CONFIG_ROCKCHIP_RK3036)
struct rk3036_grf *grf =
syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
@@ -81,7 +88,9 @@ static struct ram_ops dmc_ops = {
};
static const struct udevice_id dmc_ids[] = {
-#if defined(CONFIG_ROCKCHIP_RK3036)
+#if defined(CONFIG_ROCKCHIP_RV1108)
+ { .compatible = "rockchip,rv1108-dmc" },
+#elif defined(CONFIG_ROCKCHIP_RK3036)
{ .compatible = "rockchip,rk3036-dmc" },
#elif defined(CONFIG_ROCKCHIP_RK3308)
{ .compatible = "rockchip,rk3308-dmc" },
diff --git a/drivers/ram/rockchip/sdram_rk3399.c b/drivers/ram/rockchip/sdram_rk3399.c
index 2d1e094c2f..11641468cc 100644
--- a/drivers/ram/rockchip/sdram_rk3399.c
+++ b/drivers/ram/rockchip/sdram_rk3399.c
@@ -1436,6 +1436,9 @@ static int data_training_ca(const struct chan_info *chan, u32 channel,
u32 rank = sdram_params->ch[channel].cap_info.rank;
u32 rank_mask;
+ /* clear interrupt,PI_175 PI_INT_ACK:WR:0:17 */
+ writel(0x00003f7c, (&denali_pi[175]));
+
if (sdram_params->base.dramtype == LPDDR4)
rank_mask = (rank == 1) ? 0x5 : 0xf;
else
@@ -1493,6 +1496,9 @@ static int data_training_wl(const struct chan_info *chan, u32 channel,
u32 obs_0, obs_1, obs_2, obs_3, obs_err = 0;
u32 rank = sdram_params->ch[channel].cap_info.rank;
+ /* clear interrupt,PI_175 PI_INT_ACK:WR:0:17 */
+ writel(0x00003f7c, (&denali_pi[175]));
+
for (i = 0; i < rank; i++) {
select_per_cs_training_index(chan, i);
/* PI_60 PI_WRLVL_EN:RW:8:2 */
@@ -1549,6 +1555,9 @@ static int data_training_rg(const struct chan_info *chan, u32 channel,
u32 obs_0, obs_1, obs_2, obs_3, obs_err = 0;
u32 rank = sdram_params->ch[channel].cap_info.rank;
+ /* clear interrupt,PI_175 PI_INT_ACK:WR:0:17 */
+ writel(0x00003f7c, (&denali_pi[175]));
+
for (i = 0; i < rank; i++) {
select_per_cs_training_index(chan, i);
/* PI_80 PI_RDLVL_GATE_EN:RW:24:2 */
@@ -1604,6 +1613,9 @@ static int data_training_rl(const struct chan_info *chan, u32 channel,
u32 i, tmp;
u32 rank = sdram_params->ch[channel].cap_info.rank;
+ /* clear interrupt,PI_175 PI_INT_ACK:WR:0:17 */
+ writel(0x00003f7c, (&denali_pi[175]));
+
for (i = 0; i < rank; i++) {
select_per_cs_training_index(chan, i);
/* PI_80 PI_RDLVL_EN:RW:16:2 */
@@ -1646,6 +1658,9 @@ static int data_training_wdql(const struct chan_info *chan, u32 channel,
u32 rank = sdram_params->ch[channel].cap_info.rank;
u32 rank_mask;
+ /* clear interrupt,PI_175 PI_INT_ACK:WR:0:17 */
+ writel(0x00003f7c, (&denali_pi[175]));
+
if (sdram_params->base.dramtype == LPDDR4)
rank_mask = (rank == 1) ? 0x5 : 0xf;
else
diff --git a/drivers/ram/rockchip/sdram_rv1108.c b/drivers/ram/rockchip/sdram_rv1108.c
index d8851adf79..696e24838c 100644
--- a/drivers/ram/rockchip/sdram_rv1108.c
+++ b/drivers/ram/rockchip/sdram_rv1108.c
@@ -112,9 +112,21 @@ void *get_base_addr(unsigned int *reg, unsigned int offset)
return (void *)p;
}
+void get_ddr_param(struct dram_info *sdram_priv,
+ struct ddr_param *ddr_param)
+{
+ size_t ram_size =
+ rockchip_sdram_size((phys_addr_t)&sdram_priv->grf->os_reg2);
+
+ ddr_param->count = 1;
+ ddr_param->para[0] = CONFIG_SYS_SDRAM_BASE;
+ ddr_param->para[1] = ram_size;
+}
+
int sdram_init(void)
{
int ret;
+ struct ddr_param ddr_param;
struct dram_info *sdram_priv = &info;
struct driver_info *info =
ll_entry_start(struct driver_info, driver_info);
@@ -136,5 +148,8 @@ int sdram_init(void)
if (ret)
debug("rv1108_sdram_init() fail!");
+ get_ddr_param(sdram_priv, &ddr_param);
+ rockchip_setup_ddr_param(&ddr_param);
+
return ret;
}
diff --git a/drivers/rkflash/flash.c b/drivers/rkflash/flash.c
index 71ed9694ad..835efe7f51 100644
--- a/drivers/rkflash/flash.c
+++ b/drivers/rkflash/flash.c
@@ -20,6 +20,7 @@ static u8 g_nand_max_die;
static u16 g_totle_block;
static u8 g_nand_flash_ecc_bits;
static u8 g_nand_idb_res_blk_num;
+static u8 g_nand_ecc_en;
static struct NAND_PARA_INFO_T nand_para = {
2,
@@ -145,9 +146,28 @@ static void flash_read_random_dataout_cmd(u8 cs, u32 col_addr)
nandc_writel(READ_DP_OUT_CMD & 0x00ff, NANDC_CHIP_CMD(cs));
}
+static u32 flash_read_ecc(u8 cs)
+{
+ u32 ecc0, ecc1;
+
+ nandc_writel(READ_ECC_STATUS_CMD, NANDC_CHIP_CMD(cs));
+ nandc_delayns(80);
+ ecc0 = nandc_readl(NANDC_CHIP_DATA(cs)) & 0xF;
+ ecc1 = nandc_readl(NANDC_CHIP_DATA(cs)) & 0xF;
+ if (ecc1 > ecc0)
+ ecc0 = ecc1;
+ ecc1 = nandc_readl(NANDC_CHIP_DATA(cs)) & 0xF;
+ if (ecc1 > ecc0)
+ ecc0 = ecc1;
+ ecc1 = nandc_readl(NANDC_CHIP_DATA(cs)) & 0xF;
+ if (ecc1 > ecc0)
+ ecc0 = ecc1;
+
+ return ecc0;
+}
+
static u32 flash_read_page_raw(u8 cs, u32 page_addr, u32 *p_data, u32 *p_spare)
{
- u32 ret = 0;
u32 error_ecc_bits;
u32 sec_per_page = nand_para.sec_per_page;
@@ -160,34 +180,53 @@ static u32 flash_read_page_raw(u8 cs, u32 page_addr, u32 *p_data, u32 *p_spare)
error_ecc_bits = nandc_xfer_data(cs, NANDC_READ, sec_per_page,
p_data, p_spare);
- if (error_ecc_bits > 2) {
- PRINT_NANDC_E("FlashReadRawPage %x %x error_ecc_bits %d\n",
- cs, page_addr, error_ecc_bits);
+ /*
+ if (error_ecc_bits > 12) {
+ PRINT_NANDC_E("%s %x %x error_ecc_bits %d\n",
+ __func__, cs, page_addr, error_ecc_bits);
if (p_data)
- PRINT_NANDC_HEX("data:", p_data, 4, 8);
+ PRINT_NANDC_HEX("data:", p_data, 4, 2);
if (p_spare)
PRINT_NANDC_HEX("spare:", p_spare, 4, 2);
}
+ */
nandc_flash_de_cs(cs);
if (error_ecc_bits != NAND_STS_ECC_ERR) {
- if (error_ecc_bits >= (u32)nand_para.ecc_bits - 3)
- ret = NAND_STS_REFRESH;
- else
- ret = NAND_STS_OK;
+ if (error_ecc_bits >= (u32)nand_para.ecc_bits - 3) {
+ error_ecc_bits = NAND_STS_REFRESH;
+ } else {
+ error_ecc_bits = NAND_STS_OK;
+ if (g_nand_ecc_en) {
+ u32 nand_ecc = flash_read_ecc(cs);
+
+ if (nand_ecc >= 6) {
+ PRINT_NANDC_E("%s nand ecc %x ecc %d\n",
+ __func__, page_addr, nand_ecc);
+ error_ecc_bits = NAND_STS_REFRESH;
+ }
+ }
+ }
}
- return ret;
+ return error_ecc_bits;
}
static u32 flash_read_page(u8 cs, u32 page_addr, u32 *p_data, u32 *p_spare)
{
- u32 ret;
+ u32 ret, i;
ret = flash_read_page_raw(cs, page_addr, p_data, p_spare);
- if (ret == NAND_STS_ECC_ERR)
- ret = flash_read_page_raw(cs, page_addr, p_data, p_spare);
-
+ if (ret == NAND_STS_ECC_ERR) {
+ for (i = 0; i < 50; i++) {
+ ret = flash_read_page_raw(cs, page_addr, p_data, p_spare);
+ if (ret != NAND_STS_ECC_ERR) {
+ ret = NAND_STS_REFRESH;
+ break;
+ }
+ }
+ PRINT_NANDC_E("flash_read_page %x err_ecc %d\n", page_addr, ret);
+ }
return ret;
}
@@ -471,6 +510,7 @@ u32 nandc_flash_init(void __iomem *nandc_addr)
PRINT_NANDC_I("...%s enter...\n", __func__);
g_nand_idb_res_blk_num = MAX_IDB_RESERVED_BLOCK;
+ g_nand_ecc_en = 0;
nandc_init(nandc_addr);
@@ -485,11 +525,14 @@ u32 nandc_flash_init(void __iomem *nandc_addr)
id_byte[0][1] != 0xDA &&
id_byte[0][1] != 0xD1 &&
id_byte[0][1] != 0x95 &&
- id_byte[0][1] != 0xDC)
+ id_byte[0][1] != 0xDC &&
+ id_byte[0][1] != 0x48)
return FTL_UNSUPPORTED_FLASH;
}
}
+ if (id_byte[0][0] == 0x98 && (id_byte[0][4] & 0x80))
+ g_nand_ecc_en = 1;
nand_para.nand_id[1] = id_byte[0][1];
if (id_byte[0][1] == 0xDA) {
nand_para.plane_per_die = 2;
@@ -500,12 +543,18 @@ u32 nandc_flash_init(void __iomem *nandc_addr)
nand_para.plane_per_die = 2;
nand_para.sec_per_page = 8;
} else if (id_byte[0][0] == 0x98 && id_byte[0][3] == 0x26) {
- nand_para.blk_per_plane = 2048;
+ nand_para.blk_per_plane = 1024;
nand_para.sec_per_page = 8;
+ nand_para.plane_per_die = 2;
} else {
nand_para.plane_per_die = 2;
nand_para.blk_per_plane = 2048;
}
+ } else if (id_byte[0][1] == 0x48) {
+ nand_para.sec_per_page = 8;
+ nand_para.page_per_blk = 128;
+ nand_para.plane_per_die = 2;
+ nand_para.blk_per_plane = 2048;
}
flash_die_info_init();
flash_bch_sel(nand_para.ecc_bits);
diff --git a/drivers/rkflash/flash.h b/drivers/rkflash/flash.h
index abc3fe14da..92e9878030 100644
--- a/drivers/rkflash/flash.h
+++ b/drivers/rkflash/flash.h
@@ -42,6 +42,7 @@
#define BLOCK_ERASE_CMD 0x60d0
#define READ_CMD 0x0030
#define READ_DP_OUT_CMD 0x05E0
+#define READ_ECC_STATUS_CMD 0x7A
#define SAMSUNG 0x00 /* SAMSUNG */
#define TOSHIBA 0x01 /* TOSHIBA */
diff --git a/drivers/rkflash/flash_com.h b/drivers/rkflash/flash_com.h
index 71055797c8..b60875d382 100644
--- a/drivers/rkflash/flash_com.h
+++ b/drivers/rkflash/flash_com.h
@@ -17,6 +17,11 @@
#define NAND_STS_EMPTY 512 /* page is not proged */
#define NAND_STS_ECC_ERR NAND_ERROR
+#define NAND_IDB_START 64 /* 32 KB*/
+#define NAND_IDB_SIZE 512 /* 256 KB*/
+#define NAND_IDB_END NAND_IDB_START + NAND_IDB_SIZE - 1
+#define DEFAULT_IDB_RESERVED_BLOCK 16
+
#define FULL_SLC 0
#define SLC 1
diff --git a/drivers/rkflash/rk_sftl_arm_v7.S b/drivers/rkflash/rk_sftl_arm_v7.S
index 294e85db8e..ddde4a609f 100644
--- a/drivers/rkflash/rk_sftl_arm_v7.S
+++ b/drivers/rkflash/rk_sftl_arm_v7.S
@@ -2,7 +2,7 @@
* Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
*
* SPDX-License-Identifier: GPL-2.0
- * date: 2018-12-27
+ * date: 2019-02-20
*/
.arch armv7-a
.eabi_attribute 20, 1
@@ -812,126 +812,100 @@ IsInFreeQueue:
.fpu softvfp
.type insert_data_list, %function
insert_data_list:
- @ args = 0, pretend = 0, frame = 16
+ @ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r10, fp, lr}
- ldr r3, .L100
- ldrh lr, [r3]
- cmp lr, r0
+ ldr r3, .L99
+ push {r4, r5, r6, r7, r8, r10, fp, lr}
+ ldrh r8, [r3]
+ cmp r8, r0
bls .L86
- ldr r3, .L100+4
+ ldr r3, .L99+4
movs r5, #6
+ muls r5, r0, r5
ldr r4, [r3]
- mul r3, r5, r0
- str r3, [sp, #4]
- adds r1, r4, r3
- ldr r2, [sp, #4]
movw r3, #65535
+ adds r1, r4, r5
strh r3, [r1, #2] @ movhi
- strh r3, [r4, r2] @ movhi
- ldr r3, .L100+8
+ strh r3, [r4, r5] @ movhi
+ ldr r3, .L99+8
ldr ip, [r3]
cmp ip, #0
bne .L87
-.L99:
+.L98:
str r1, [r3]
.L86:
movs r0, #0
- add sp, sp, #16
- @ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
.L87:
- ldr r3, .L100+12
- lsls r2, r0, #1
- ldr r3, [r3]
- str r3, [sp, #8]
- ldrh r6, [r3, r0, lsl #1]
- ldrh r3, [r1, #4]
- cbz r3, .L97
- mul fp, r3, r6
+ ldr r3, .L99+12
+ ldrh r6, [r1, #4]
+ ldr r10, [r3]
+ ldrh r3, [r10, r0, lsl #1]
+ cbz r6, .L94
+ muls r6, r3, r6
.L88:
- sub r3, ip, r4
- asrs r6, r3, #1
- ldr r3, .L100+16
- muls r3, r6, r3
- ldr r6, .L100+20
- ldr r8, [r6]
- movs r6, #0
- uxth r3, r3
- add r2, r8, r2
- str r2, [sp, #12]
- mov r2, ip
-.L95:
- adds r6, r6, #1
- uxth r6, r6
- cmp lr, r6
+ sub r2, ip, r4
+ movs r7, #0
+ asrs r3, r2, #1
+ ldr r2, .L99+16
+ muls r2, r3, r2
+ mov r3, ip
+ uxth r2, r2
+.L92:
+ adds r7, r7, #1
+ uxth r7, r7
+ cmp r8, r7
bcc .L86
- cmp r3, r0
+ cmp r2, r0
beq .L86
- ldr r7, [sp, #8]
- lsl r10, r3, #1
- ldrh r7, [r7, r3, lsl #1]
- mov r5, r7
- ldrh r7, [r2, #4]
- cbz r7, .L98
- muls r7, r5, r7
-.L90:
- cmp fp, r7
+ ldrh lr, [r3, #4]
+ cmp lr, #0
+ beq .L90
+ ldrh fp, [r10, r2, lsl #1]
+ mul lr, lr, fp
+ cmp r6, lr
+ bls .L90
+ ldrh lr, [r3]
+ movw fp, #65535
+ cmp lr, fp
bne .L91
- ldr r5, [sp, #12]
- ldrh r10, [r8, r10]
- ldrh r7, [r5]
- cmp r10, r7
- bcc .L93
-.L92:
- ldr r5, [sp, #4]
- cmp r2, ip
- strh r3, [r4, r5] @ movhi
- ldrh r3, [r2, #2]
- strh r3, [r1, #2] @ movhi
- bne .L96
- strh r0, [r2, #2] @ movhi
- ldr r3, .L100+8
- b .L99
-.L97:
- mov fp, #-1
+ strh r2, [r1, #2] @ movhi
+ strh r0, [r3] @ movhi
+ ldr r3, .L99+20
+ b .L98
+.L94:
+ mov r6, #-1
b .L88
-.L98:
- mov r7, #-1
- b .L90
.L91:
- bcc .L92
-.L93:
- ldrh r7, [r2]
- movw r5, #65535
- cmp r7, r5
- bne .L94
- strh r3, [r1, #2] @ movhi
- strh r0, [r2] @ movhi
- ldr r3, .L100+24
- b .L99
-.L94:
movs r3, #6
- mla r2, r3, r7, r4
- mov r3, r7
- b .L95
-.L96:
- ldrh r1, [r2, #2]
- movs r3, #6
- muls r3, r1, r3
- strh r0, [r4, r3] @ movhi
- strh r0, [r2, #2] @ movhi
+ mov r2, lr
+ mla r3, r3, lr, r4
+ b .L92
+.L90:
+ strh r2, [r4, r5] @ movhi
+ cmp r3, ip
+ ldrh r2, [r3, #2]
+ strh r2, [r1, #2] @ movhi
+ bne .L93
+ strh r0, [r3, #2] @ movhi
+ ldr r3, .L99+8
+ b .L98
+.L93:
+ ldrh r1, [r3, #2]
+ movs r2, #6
+ muls r2, r1, r2
+ strh r0, [r4, r2] @ movhi
+ strh r0, [r3, #2] @ movhi
b .L86
-.L101:
- .align 2
.L100:
+ .align 2
+.L99:
.word .LANCHOR5
.word .LANCHOR40
.word .LANCHOR41
.word .LANCHOR42
.word -1431655765
.word .LANCHOR43
- .word .LANCHOR44
.size insert_data_list, .-insert_data_list
.section .text.INSERT_DATA_LIST,"ax",%progbits
.align 1
@@ -946,28 +920,28 @@ INSERT_DATA_LIST:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, lr}
bl insert_data_list
- ldr r2, .L104
+ ldr r2, .L103
ldrh r3, [r2]
adds r3, r3, #1
uxth r3, r3
strh r3, [r2] @ movhi
- ldr r2, .L104+4
+ ldr r2, .L103+4
ldrh r2, [r2]
cmp r2, r3
- bcs .L102
+ bcs .L101
movs r2, #214
- ldr r1, .L104+8
- ldr r0, .L104+12
+ ldr r1, .L103+8
+ ldr r0, .L103+12
pop {r3, lr}
b printf
-.L102:
+.L101:
pop {r3, pc}
-.L105:
- .align 2
.L104:
- .word .LANCHOR45
+ .align 2
+.L103:
+ .word .LANCHOR44
.word .LANCHOR5
- .word .LANCHOR46
+ .word .LANCHOR45
.word .LC1
.size INSERT_DATA_LIST, .-INSERT_DATA_LIST
.section .text.insert_free_list,"ax",%progbits
@@ -984,48 +958,48 @@ insert_free_list:
movw r1, #65535
push {r4, r5, r6, r7, r8, r10, fp, lr}
cmp r0, r1
- beq .L107
- ldr r3, .L113
+ beq .L106
+ ldr r3, .L112
mov r10, #6
mul r7, r10, r0
ldr r4, [r3]
- ldr r3, .L113+4
+ ldr r3, .L112+4
adds r5, r4, r7
ldr r6, [r3]
mov lr, r3
strh r1, [r5, #2] @ movhi
strh r1, [r4, r7] @ movhi
- cbnz r6, .L108
+ cbnz r6, .L107
str r5, [r3]
-.L107:
+.L106:
movs r0, #0
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L108:
- ldr r3, .L113+8
+.L107:
+ ldr r3, .L112+8
subs r2, r6, r4
mov fp, r1
ldr ip, [r3]
asrs r3, r2, #1
- ldr r2, .L113+12
+ ldr r2, .L112+12
ldrh r8, [ip, r0, lsl #1]
muls r2, r3, r2
mov r3, r6
uxth r2, r2
-.L111:
+.L110:
ldrh r1, [ip, r2, lsl #1]
cmp r1, r8
- bcs .L109
+ bcs .L108
ldrh r1, [r3]
cmp r1, fp
- bne .L110
+ bne .L109
strh r2, [r5, #2] @ movhi
strh r0, [r3] @ movhi
- b .L107
-.L110:
+ b .L106
+.L109:
mla r3, r10, r1, r4
mov r2, r1
- b .L111
-.L109:
+ b .L110
+.L108:
ldrh r1, [r3, #2]
cmp r3, r6
strh r1, [r5, #2] @ movhi
@@ -1040,13 +1014,13 @@ insert_free_list:
itt ne
strhne r0, [r4, r2] @ movhi
strhne r0, [r3, #2] @ movhi
- b .L107
-.L114:
- .align 2
+ b .L106
.L113:
+ .align 2
+.L112:
.word .LANCHOR40
+ .word .LANCHOR46
.word .LANCHOR47
- .word .LANCHOR43
.word -1431655765
.size insert_free_list, .-insert_free_list
.section .text.INSERT_FREE_LIST,"ax",%progbits
@@ -1062,25 +1036,25 @@ INSERT_FREE_LIST:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, lr}
bl insert_free_list
- ldr r2, .L117
+ ldr r2, .L116
ldrh r3, [r2]
adds r3, r3, #1
uxth r3, r3
strh r3, [r2] @ movhi
- ldr r2, .L117+4
+ ldr r2, .L116+4
ldrh r2, [r2]
cmp r2, r3
- bcs .L115
+ bcs .L114
movs r2, #207
- ldr r1, .L117+8
- ldr r0, .L117+12
+ ldr r1, .L116+8
+ ldr r0, .L116+12
pop {r3, lr}
b printf
-.L115:
+.L114:
pop {r3, pc}
-.L118:
- .align 2
.L117:
+ .align 2
+.L116:
.word .LANCHOR48
.word .LANCHOR5
.word .LANCHOR49
@@ -1099,7 +1073,7 @@ List_remove_node:
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, r5, r6, r7, r8, lr}
movs r6, #6
- ldr r5, .L125
+ ldr r5, .L124
muls r6, r1, r6
movw r3, #65535
mov r8, r0
@@ -1107,20 +1081,20 @@ List_remove_node:
adds r4, r7, r6
ldrh r2, [r4, #2]
cmp r2, r3
- bne .L120
+ bne .L119
ldr r3, [r0]
cmp r4, r3
- beq .L120
+ beq .L119
mov r2, #372
- ldr r1, .L125+4
- ldr r0, .L125+8
+ ldr r1, .L124+4
+ ldr r0, .L124+8
bl printf
-.L120:
+.L119:
ldr r3, [r8]
movw r1, #65535
cmp r4, r3
ldrh r3, [r7, r6]
- bne .L121
+ bne .L120
cmp r3, r1
ittee ne
ldrne r0, [r5]
@@ -1131,24 +1105,24 @@ List_remove_node:
mlane r3, r2, r3, r0
strne r3, [r8]
strhne r1, [r3, #2] @ movhi
-.L123:
+.L122:
movw r3, #65535
movs r0, #0
strh r3, [r7, r6] @ movhi
strh r3, [r4, #2] @ movhi
pop {r4, r5, r6, r7, r8, pc}
-.L121:
+.L120:
cmp r3, r1
ldrh r1, [r4, #2]
- bne .L124
+ bne .L123
cmp r1, r3
- beq .L123
+ beq .L122
movs r2, #6
ldr r0, [r5]
muls r1, r2, r1
strh r3, [r0, r1] @ movhi
- b .L123
-.L124:
+ b .L122
+.L123:
ldr r0, [r5]
movs r2, #6
mla r5, r2, r3, r0
@@ -1156,10 +1130,10 @@ List_remove_node:
ldrh r1, [r4, #2]
muls r2, r1, r2
strh r3, [r0, r2] @ movhi
- b .L123
-.L126:
- .align 2
+ b .L122
.L125:
+ .align 2
+.L124:
.word .LANCHOR40
.word .LANCHOR50
.word .LC1
@@ -1177,15 +1151,15 @@ List_pop_index_node:
@ frame_needed = 0, uses_anonymous_args = 0
ldr r3, [r0]
push {r4, r5, r6, lr}
- cbz r3, .L133
- ldr r2, .L134
+ cbz r3, .L132
+ ldr r2, .L133
movw r5, #65535
movs r6, #6
ldr r2, [r2]
-.L129:
- cbnz r1, .L130
-.L132:
- ldr r4, .L134+4
+.L128:
+ cbnz r1, .L129
+.L131:
+ ldr r4, .L133+4
subs r3, r3, r2
asrs r3, r3, #1
muls r4, r3, r4
@@ -1193,20 +1167,20 @@ List_pop_index_node:
bl List_remove_node
uxth r0, r4
pop {r4, r5, r6, pc}
-.L130:
+.L129:
ldrh r4, [r3]
cmp r4, r5
- beq .L132
+ beq .L131
subs r1, r1, #1
mla r3, r6, r4, r2
uxth r1, r1
- b .L129
-.L133:
+ b .L128
+.L132:
movw r0, #65535
pop {r4, r5, r6, pc}
-.L135:
- .align 2
.L134:
+ .align 2
+.L133:
.word .LANCHOR40
.word -1431655765
.size List_pop_index_node, .-List_pop_index_node
@@ -1236,37 +1210,37 @@ List_pop_head_node:
List_get_gc_head_node:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L143
+ ldr r3, .L142
push {r4, lr}
ldr r3, [r3]
- cbz r3, .L142
- ldr r2, .L143+4
+ cbz r3, .L141
+ ldr r2, .L142+4
movs r4, #6
ldr r1, [r2]
movw r2, #65535
-.L139:
- cbz r0, .L140
+.L138:
+ cbz r0, .L139
ldrh r3, [r3]
cmp r3, r2
- bne .L141
-.L142:
+ bne .L140
+.L141:
movw r0, #65535
pop {r4, pc}
-.L141:
+.L140:
subs r0, r0, #1
mla r3, r4, r3, r1
uxth r0, r0
- b .L139
-.L140:
- ldr r0, .L143+8
+ b .L138
+.L139:
+ ldr r0, .L142+8
subs r3, r3, r1
asrs r3, r3, #1
muls r3, r0, r3
uxth r0, r3
pop {r4, pc}
-.L144:
- .align 2
.L143:
+ .align 2
+.L142:
.word .LANCHOR41
.word .LANCHOR40
.word -1431655765
@@ -1282,61 +1256,61 @@ List_get_gc_head_node:
List_update_data_list:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L156
+ ldr r3, .L155
push {r4, r5, r6, r7, r8, r10, fp, lr}
mov r4, r0
ldrh r3, [r3]
cmp r3, r0
- beq .L147
- ldr r3, .L156+4
+ beq .L146
+ ldr r3, .L155+4
ldrh r3, [r3]
cmp r3, r0
- beq .L147
- ldr r3, .L156+8
+ beq .L146
+ ldr r3, .L155+8
ldrh r3, [r3]
cmp r3, r0
- beq .L147
- ldr r7, .L156+12
+ beq .L146
+ ldr r7, .L155+12
movs r6, #6
- ldr r3, .L156+16
+ ldr r3, .L155+16
muls r6, r0, r6
ldr fp, [r7]
ldr r3, [r3]
add r10, fp, r6
cmp r10, r3
- beq .L147
- ldr r3, .L156+20
+ beq .L146
+ ldr r3, .L155+20
ldrh r5, [r10, #4]
ldr r2, [r3]
mov r8, r3
ldrh r2, [r2, r0, lsl #1]
cmp r5, #0
- beq .L154
+ beq .L153
muls r5, r2, r5
-.L149:
+.L148:
ldrh r3, [r10, #2]
movw r2, #65535
cmp r3, r2
- bne .L150
+ bne .L149
ldrh r2, [fp, r6]
cmp r2, r3
- bne .L150
+ bne .L149
movw r2, #463
- ldr r1, .L156+24
- ldr r0, .L156+28
+ ldr r1, .L155+24
+ ldr r0, .L155+28
bl printf
-.L150:
+.L149:
ldrh r3, [r10, #2]
movw r2, #65535
cmp r3, r2
- bne .L151
+ bne .L150
ldrh r2, [fp, r6]
cmp r2, r3
- beq .L147
-.L151:
+ beq .L146
+.L150:
movs r2, #6
muls r2, r3, r2
- ldr r3, .L156+32
+ ldr r3, .L155+32
asrs r1, r2, #1
muls r3, r1, r3
ldr r1, [r8]
@@ -1344,39 +1318,39 @@ List_update_data_list:
ldr r1, [r7]
add r2, r2, r1
ldrh r3, [r2, #4]
- cbz r3, .L155
+ cbz r3, .L154
muls r3, r0, r3
-.L152:
+.L151:
cmp r5, r3
- bcs .L147
- ldr r5, .L156+36
+ bcs .L146
+ ldr r5, .L155+36
mov r1, r4
- ldr r0, .L156+16
+ ldr r0, .L155+16
bl List_remove_node
ldrh r3, [r5]
- cbnz r3, .L153
+ cbnz r3, .L152
mov r2, #474
- ldr r1, .L156+24
- ldr r0, .L156+28
+ ldr r1, .L155+24
+ ldr r0, .L155+28
bl printf
-.L153:
+.L152:
ldrh r3, [r5]
mov r0, r4
subs r3, r3, #1
strh r3, [r5] @ movhi
bl INSERT_DATA_LIST
-.L147:
+.L146:
movs r0, #0
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L154:
+.L153:
mov r5, #-1
- b .L149
-.L155:
+ b .L148
+.L154:
mov r3, #-1
- b .L152
-.L157:
- .align 2
+ b .L151
.L156:
+ .align 2
+.L155:
.word .LANCHOR51
.word .LANCHOR52
.word .LANCHOR53
@@ -1386,7 +1360,7 @@ List_update_data_list:
.word .LANCHOR54
.word .LC1
.word -1431655765
- .word .LANCHOR45
+ .word .LANCHOR44
.size List_update_data_list, .-List_update_data_list
.section .text.select_l2p_ram_region,"ax",%progbits
.align 1
@@ -1401,79 +1375,79 @@ select_l2p_ram_region:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, r6, r7, lr}
movs r1, #0
- ldr r3, .L168
+ ldr r3, .L167
movs r0, #12
movw r5, #65535
ldrh r2, [r3]
- ldr r3, .L168+4
+ ldr r3, .L167+4
ldr r3, [r3]
-.L159:
+.L158:
uxth r4, r1
cmp r4, r2
- bcc .L161
+ bcc .L160
mov r4, r2
movs r1, #0
mov r6, #-2147483648
movs r7, #12
-.L162:
+.L161:
uxth r5, r1
cmp r5, r2
- bcc .L164
+ bcc .L163
cmp r4, r2
- bcc .L160
- ldr r1, .L168+8
+ bcc .L159
+ ldr r1, .L167+8
mov r4, r2
mov r0, #-1
ldrh r7, [r1]
movs r1, #0
-.L165:
+.L164:
uxth r5, r1
cmp r5, r2
- bcc .L167
+ bcc .L166
cmp r4, r2
- bcc .L160
+ bcc .L159
movw r2, #789
- ldr r1, .L168+12
- ldr r0, .L168+16
+ ldr r1, .L167+12
+ ldr r0, .L167+16
bl printf
- b .L160
-.L161:
+ b .L159
+.L160:
adds r1, r1, #1
mla r6, r0, r1, r3
ldrh r6, [r6, #-12]
cmp r6, r5
- bne .L159
-.L160:
+ bne .L158
+.L159:
mov r0, r4
pop {r3, r4, r5, r6, r7, pc}
-.L164:
+.L163:
mla r0, r7, r1, r3
ldr r0, [r0, #4]
cmp r0, #0
- blt .L163
+ blt .L162
cmp r6, r0
itt hi
movhi r6, r0
movhi r4, r5
-.L163:
+.L162:
adds r1, r1, #1
- b .L162
-.L167:
+ b .L161
+.L166:
ldr r6, [r3, #4]
cmp r0, r6
- bls .L166
+ bls .L165
ldrh ip, [r3]
cmp ip, r7
itt ne
movne r0, r6
movne r4, r5
-.L166:
+.L165:
adds r1, r1, #1
adds r3, r3, #12
- b .L165
-.L169:
- .align 2
+ b .L164
.L168:
+ .align 2
+.L167:
.word .LANCHOR33
.word .LANCHOR55
.word .LANCHOR56
@@ -1491,45 +1465,45 @@ select_l2p_ram_region:
FtlUpdateVaildLpn:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r2, .L180
+ ldr r2, .L179
push {r4, r5, r6, lr}
mov r1, r2
ldrh r3, [r2]
cmp r3, #4
- bhi .L171
- cbnz r0, .L171
+ bhi .L170
+ cbnz r0, .L170
adds r3, r3, #1
strh r3, [r2] @ movhi
pop {r4, r5, r6, pc}
-.L171:
+.L170:
movs r3, #0
- ldr r0, .L180+4
+ ldr r0, .L179+4
strh r3, [r1] @ movhi
movw r6, #65535
- ldr r1, .L180+8
+ ldr r1, .L179+8
ldrh r4, [r0]
mov r0, r3
- ldr r2, .L180+12
+ ldr r2, .L179+12
ldr r1, [r1]
str r3, [r2]
add r4, r1, r4, lsl #1
-.L172:
+.L171:
cmp r1, r4
- bne .L174
- cbz r3, .L170
+ bne .L173
+ cbz r3, .L169
str r0, [r2]
-.L170:
+.L169:
pop {r4, r5, r6, pc}
-.L174:
+.L173:
ldrh r5, [r1], #2
cmp r5, r6
itt ne
addne r0, r0, r5
movne r3, #1
- b .L172
-.L181:
- .align 2
+ b .L171
.L180:
+ .align 2
+.L179:
.word .LANCHOR58
.word .LANCHOR5
.word .LANCHOR42
@@ -1548,10 +1522,10 @@ ftl_set_blk_mode:
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
mov r3, r0
- cbz r1, .L183
+ cbz r1, .L182
b ftl_set_blk_mode.part.6
-.L183:
- ldr r2, .L184
+.L182:
+ ldr r2, .L183
lsrs r0, r0, #5
and r3, r3, #31
ldr r1, [r2]
@@ -1561,9 +1535,9 @@ ftl_set_blk_mode:
bic r2, r2, r3
str r2, [r1, r0, lsl #2]
bx lr
-.L185:
- .align 2
.L184:
+ .align 2
+.L183:
.word .LANCHOR1
.size ftl_set_blk_mode, .-ftl_set_blk_mode
.section .text.ftl_get_blk_mode,"ax",%progbits
@@ -1578,7 +1552,7 @@ ftl_get_blk_mode:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
- ldr r3, .L187
+ ldr r3, .L186
lsrs r2, r0, #5
and r0, r0, #31
ldr r3, [r3]
@@ -1586,9 +1560,9 @@ ftl_get_blk_mode:
lsr r0, r3, r0
and r0, r0, #1
bx lr
-.L188:
- .align 2
.L187:
+ .align 2
+.L186:
.word .LANCHOR1
.size ftl_get_blk_mode, .-ftl_get_blk_mode
.section .text.ftl_sb_update_avl_pages,"ax",%progbits
@@ -1606,14 +1580,14 @@ ftl_sb_update_avl_pages:
push {r4, r5, r6, lr}
strh r3, [r0, #4] @ movhi
movw r6, #65535
- ldr r3, .L196
+ ldr r3, .L195
ldrh r4, [r3]
add r3, r0, r2, lsl #1
adds r3, r3, #14
-.L190:
+.L189:
cmp r2, r4
- bcc .L192
- ldr r3, .L196+4
+ bcc .L191
+ ldr r3, .L195+4
add r5, r0, #16
movw r6, #65535
ldrh r3, [r3]
@@ -1621,12 +1595,12 @@ ftl_sb_update_avl_pages:
subs r1, r3, r1
movs r3, #0
uxth r1, r1
-.L193:
+.L192:
uxth r2, r3
cmp r4, r2
- bhi .L195
+ bhi .L194
pop {r4, r5, r6, pc}
-.L192:
+.L191:
ldrh r5, [r3, #2]!
adds r2, r2, #1
uxth r2, r2
@@ -1635,8 +1609,8 @@ ftl_sb_update_avl_pages:
ldrhne r5, [r0, #4]
addne r5, r5, #1
strhne r5, [r0, #4] @ movhi
- b .L190
-.L195:
+ b .L189
+.L194:
ldrh r2, [r5], #2
adds r3, r3, #1
cmp r2, r6
@@ -1644,10 +1618,10 @@ ftl_sb_update_avl_pages:
ldrhne r2, [r0, #4]
addne r2, r2, r1
strhne r2, [r0, #4] @ movhi
- b .L193
-.L197:
- .align 2
+ b .L192
.L196:
+ .align 2
+.L195:
.word .LANCHOR3
.word .LANCHOR19
.size ftl_sb_update_avl_pages, .-ftl_sb_update_avl_pages
@@ -1664,24 +1638,24 @@ FtlSlcSuperblockCheck:
@ frame_needed = 0, uses_anonymous_args = 0
ldrh r3, [r0, #4]
push {r4, r5, lr}
- cbz r3, .L198
+ cbz r3, .L197
ldrh r2, [r0]
movw r3, #65535
cmp r2, r3
- beq .L198
+ beq .L197
ldrb r2, [r0, #6] @ zero_extendqisi2
movs r5, #0
adds r2, r2, #8
ldrh r1, [r0, r2, lsl #1]
- ldr r2, .L204
+ ldr r2, .L203
ldrh r4, [r2]
mov r2, r3
-.L201:
+.L200:
cmp r1, r2
- beq .L203
-.L198:
+ beq .L202
+.L197:
pop {r4, r5, pc}
-.L203:
+.L202:
ldrb r3, [r0, #6] @ zero_extendqisi2
adds r3, r3, #1
uxtb r3, r3
@@ -1695,10 +1669,10 @@ FtlSlcSuperblockCheck:
ldrb r3, [r0, #6] @ zero_extendqisi2
adds r3, r3, #8
ldrh r1, [r0, r3, lsl #1]
- b .L201
-.L205:
- .align 2
+ b .L200
.L204:
+ .align 2
+.L203:
.word .LANCHOR3
.size FtlSlcSuperblockCheck, .-FtlSlcSuperblockCheck
.section .text.make_superblock,"ax",%progbits
@@ -1718,48 +1692,57 @@ make_superblock:
mov r4, r0
ldrh r3, [r3]
cmp r2, r3
- bcc .L207
- movw r2, #2156
+ bcc .L206
+ movw r2, #2148
ldr r1, .L211+4
ldr r0, .L211+8
bl printf
-.L207:
+.L206:
ldr r3, .L211+12
add r6, r4, #16
- ldr r10, .L211+20
+ ldr r10, .L211+24
movw r7, #65535
movs r5, #0
ldrh r8, [r3]
strh r5, [r4, #4] @ movhi
strb r5, [r4, #7]
-.L208:
+.L207:
uxth r3, r5
+ ldrh r1, [r4]
cmp r8, r3
- bhi .L210
+ bhi .L209
ldr r2, .L211+16
movs r0, #0
ldrb r3, [r4, #7] @ zero_extendqisi2
- strb r0, [r4, #9]
ldrh r2, [r2]
smulbb r3, r3, r2
strh r3, [r4, #4] @ movhi
+ movs r3, #0
+ strb r3, [r4, #9]
+ ldr r3, .L211+20
+ ldr r3, [r3]
+ ldrh r2, [r3, r1, lsl #1]
+ movw r3, #10000
+ cmp r2, r3
+ itt hi
+ movhi r3, #1
+ strbhi r3, [r4, #9]
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L210:
- ldrh r1, [r4]
+.L209:
ldrb r0, [r10, r5] @ zero_extendqisi2
bl V2P_block
strh r7, [r6] @ movhi
mov fp, r0
bl FtlBbmIsBadBlock
- cbnz r0, .L209
+ cbnz r0, .L208
strh fp, [r6] @ movhi
ldrb r3, [r4, #7] @ zero_extendqisi2
adds r3, r3, #1
strb r3, [r4, #7]
-.L209:
+.L208:
adds r5, r5, #1
adds r6, r6, #2
- b .L208
+ b .L207
.L212:
.align 2
.L211:
@@ -1768,6 +1751,7 @@ make_superblock:
.word .LC1
.word .LANCHOR3
.word .LANCHOR19
+ .word .LANCHOR47
.word .LANCHOR13
.size make_superblock, .-make_superblock
.section .text.update_multiplier_value,"ax",%progbits
@@ -1858,10 +1842,10 @@ GetFreeBlockMinEraseCount:
.L225:
.align 2
.L224:
- .word .LANCHOR47
+ .word .LANCHOR46
.word .LANCHOR40
.word -1431655765
- .word .LANCHOR43
+ .word .LANCHOR47
.size GetFreeBlockMinEraseCount, .-GetFreeBlockMinEraseCount
.section .text.GetFreeBlockMaxEraseCount,"ax",%progbits
.align 1
@@ -1918,11 +1902,11 @@ GetFreeBlockMaxEraseCount:
.L235:
.align 2
.L234:
- .word .LANCHOR47
+ .word .LANCHOR46
.word .LANCHOR48
.word .LANCHOR40
.word -1431655765
- .word .LANCHOR43
+ .word .LANCHOR47
.size GetFreeBlockMaxEraseCount, .-GetFreeBlockMaxEraseCount
.section .text.free_data_superblock,"ax",%progbits
.align 1
@@ -1969,49 +1953,52 @@ get_new_active_ppa:
mov r4, r0
cmp r2, r3
bne .L241
- movw r2, #2786
- ldr r1, .L254
- ldr r0, .L254+4
+ movw r2, #2781
+ ldr r1, .L255
+ ldr r0, .L255+4
bl printf
.L241:
- ldr r5, .L254+8
+ ldr r6, .L255+8
ldrh r2, [r4, #2]
- ldrh r3, [r5]
+ ldrh r3, [r6]
cmp r2, r3
bne .L242
- movw r2, #2787
- ldr r1, .L254
- ldr r0, .L254+4
+ movw r2, #2782
+ ldr r1, .L255
+ ldr r0, .L255+4
bl printf
.L242:
ldrh r3, [r4, #4]
cbnz r3, .L243
- movw r2, #2788
- ldr r1, .L254
- ldr r0, .L254+4
+ movw r2, #2783
+ ldr r1, .L255
+ ldr r0, .L255+4
bl printf
.L243:
ldrb r2, [r4, #6] @ zero_extendqisi2
movs r3, #0
strb r3, [r4, #10]
- movw r6, #65535
+ movw r5, #65535
adds r2, r2, #8
ldrh r0, [r4, r2, lsl #1]
- ldr r2, .L254+12
+ ldr r2, .L255+12
ldrh r1, [r2]
mov r2, r3
.L244:
- cmp r0, r6
- ldrb r3, [r4, #6] @ zero_extendqisi2
+ cmp r0, r5
beq .L246
+ ldrh r5, [r4, #2]
+ ldrh r6, [r6]
+ cmp r5, r6
+ bcs .L250
ldrh r2, [r4, #4]
- ldrh r6, [r4, #2]
+ orr r5, r5, r0, lsl #10
+ ldrb r3, [r4, #6] @ zero_extendqisi2
+ movw r0, #65535
subs r2, r2, #1
uxth r2, r2
- orr r6, r6, r0, lsl #10
- movw r0, #65535
strh r2, [r4, #4] @ movhi
-.L248:
+.L249:
adds r3, r3, #1
uxtb r3, r3
cmp r1, r3
@@ -2023,21 +2010,21 @@ get_new_active_ppa:
add r7, r3, #8
ldrh r7, [r4, r7, lsl #1]
cmp r7, r0
- beq .L248
+ beq .L249
strb r3, [r4, #6]
- ldrh r1, [r4, #2]
- ldrh r3, [r5]
- cmp r1, r3
+ ldrh r3, [r4, #2]
+ cmp r3, r6
bne .L240
cbz r2, .L240
- movw r2, #2809
- ldr r1, .L254
- ldr r0, .L254+4
+ movw r2, #2806
+ ldr r1, .L255
+ ldr r0, .L255+4
bl printf
.L240:
- mov r0, r6
+ mov r0, r5
pop {r3, r4, r5, r6, r7, pc}
.L246:
+ ldrb r3, [r4, #6] @ zero_extendqisi2
adds r3, r3, #1
uxtb r3, r3
cmp r3, r1
@@ -2051,9 +2038,12 @@ get_new_active_ppa:
adds r3, r3, #8
ldrh r0, [r4, r3, lsl #1]
b .L244
-.L255:
+.L250:
+ movw r5, #65535
+ b .L240
+.L256:
.align 2
-.L254:
+.L255:
.word .LANCHOR61
.word .LC1
.word .LANCHOR19
@@ -2072,54 +2062,54 @@ FtlGcBufInit:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r4, r5, r6, r7, r8, r10, fp, lr}
movs r3, #0
- ldr r1, .L261
+ ldr r1, .L262
mov fp, #1
- ldr r2, .L261+4
+ ldr r2, .L262+4
ldr r5, [r1]
- ldr r1, .L261+8
+ ldr r1, .L262+8
str r3, [r2]
- ldr r2, .L261+12
+ ldr r2, .L262+12
mov r0, r5
ldr r1, [r1]
ldrh r2, [r2]
str r1, [sp, #4]
- ldr r1, .L261+16
+ ldr r1, .L262+16
ldrh r1, [r1]
str r1, [sp]
- ldr r1, .L261+20
+ ldr r1, .L262+20
ldr r10, [r1]
- ldr r1, .L261+24
+ ldr r1, .L262+24
ldrh r7, [r1]
- ldr r1, .L261+28
+ ldr r1, .L262+28
ldr r4, [r1]
movs r1, #12
mla r1, r2, r1, r1
adds r4, r4, #8
add r8, r5, r1
mov r1, r3
-.L257:
+.L258:
adds r0, r0, #12
ldr r6, [sp]
cmp r0, r8
add ip, r3, r7
add r4, r4, #20
add lr, r1, r6
- bne .L258
- ldr r3, .L261+32
+ bne .L259
+ ldr r3, .L262+32
mov lr, #12
mov r8, #0
ldr r0, [r3]
- ldr r3, .L261+8
+ ldr r3, .L262+8
ldr r4, [r3]
- ldr r3, .L261+20
+ ldr r3, .L262+20
ldr ip, [r3]
-.L259:
+.L260:
cmp r2, r0
- bcc .L260
+ bcc .L261
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L258:
+.L259:
bic r1, r1, #3
bic r3, r3, #3
mov r6, r1
@@ -2133,8 +2123,8 @@ FtlGcBufInit:
str r3, [r4, #-16]
mov r3, ip
str r6, [r4, #-20]
- b .L257
-.L260:
+ b .L258
+.L261:
ldr r3, [sp]
mul r10, lr, r2
muls r3, r2, r3
@@ -2149,10 +2139,10 @@ FtlGcBufInit:
bic r3, r3, #3
add r3, r3, ip
str r3, [r1, #4]
- b .L259
-.L262:
+ b .L260
+.L263:
.align 2
-.L261:
+.L262:
.word .LANCHOR63
.word .LANCHOR62
.word .LANCHOR64
@@ -2174,41 +2164,41 @@ FtlGcBufInit:
FtlGcBufFree:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L270
+ ldr r3, .L271
mov ip, #12
push {r4, r5, r6, r7, r8, r10, fp, lr}
movs r4, #0
mov fp, #20
mov lr, r4
ldr r7, [r3]
- ldr r3, .L270+4
+ ldr r3, .L271+4
ldr r5, [r3]
-.L264:
+.L265:
uxth r3, r4
cmp r1, r3
- bls .L263
+ bls .L264
mla r8, fp, r3, r0
movs r2, #0
-.L265:
+.L266:
uxth r3, r2
cmp r7, r3
- bls .L266
+ bls .L267
mul r3, ip, r3
ldr r6, [r8, #8]
adds r2, r2, #1
add r10, r5, r3
ldr r3, [r5, r3]
cmp r3, r6
- bne .L265
+ bne .L266
str lr, [r10, #8]
-.L266:
+.L267:
adds r4, r4, #1
- b .L264
-.L263:
+ b .L265
+.L264:
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L271:
+.L272:
.align 2
-.L270:
+.L271:
.word .LANCHOR67
.word .LANCHOR63
.size FtlGcBufFree, .-FtlGcBufFree
@@ -2223,43 +2213,43 @@ FtlGcBufFree:
FtlGcBufAlloc:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L279
+ ldr r3, .L280
movs r2, #0
push {r4, r5, r6, r7, r8, r10, lr}
mov ip, #12
movs r7, #1
mov lr, #20
ldr r4, [r3]
- ldr r3, .L279+4
+ ldr r3, .L280+4
ldr r5, [r3]
-.L273:
+.L274:
uxth r8, r2
cmp r1, r8
- bhi .L277
+ bhi .L278
pop {r4, r5, r6, r7, r8, r10, pc}
-.L277:
+.L278:
mov r10, #0
-.L274:
+.L275:
uxth r3, r10
cmp r4, r3
- bls .L275
+ bls .L276
mla r3, ip, r3, r5
add r10, r10, #1
ldr r6, [r3, #8]
cmp r6, #0
- bne .L274
+ bne .L275
mla r8, lr, r8, r0
str r7, [r3, #8]
ldr r6, [r3]
ldr r3, [r3, #4]
str r6, [r8, #8]
str r3, [r8, #12]
-.L275:
+.L276:
adds r2, r2, #1
- b .L273
-.L280:
+ b .L274
+.L281:
.align 2
-.L279:
+.L280:
.word .LANCHOR67
.word .LANCHOR63
.size FtlGcBufAlloc, .-FtlGcBufAlloc
@@ -2275,25 +2265,25 @@ IsBlkInGcList:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
- ldr r3, .L286
- ldr r2, .L286+4
+ ldr r3, .L287
+ ldr r2, .L287+4
ldr r3, [r3]
ldrh r2, [r2]
add r2, r3, r2, lsl #1
-.L282:
+.L283:
cmp r3, r2
- bne .L284
+ bne .L285
movs r0, #0
bx lr
-.L284:
+.L285:
ldrh r1, [r3], #2
cmp r1, r0
- bne .L282
+ bne .L283
movs r0, #1
bx lr
-.L287:
+.L288:
.align 2
-.L286:
+.L287:
.word .LANCHOR68
.word .LANCHOR69
.size IsBlkInGcList, .-IsBlkInGcList
@@ -2310,35 +2300,35 @@ FtlGcUpdatePage:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, r6, r7, lr}
mov r5, r0
- ldr r4, .L292
+ ldr r4, .L293
ubfx r0, r0, #10, #16
mov r6, r1
mov r7, r2
bl P2V_block_in_plane
- ldr r3, .L292+4
+ ldr r3, .L293+4
ldrh r1, [r4]
ldr r2, [r3]
movs r3, #0
-.L289:
+.L290:
uxth ip, r3
cmp ip, r1
- bcc .L291
- bne .L290
+ bcc .L292
+ bne .L291
strh r0, [r2, ip, lsl #1] @ movhi
ldrh r3, [r4]
adds r3, r3, #1
strh r3, [r4] @ movhi
- b .L290
-.L291:
+ b .L291
+.L292:
adds r3, r3, #1
add ip, r2, r3, lsl #1
ldrh ip, [ip, #-2]
cmp ip, r0
- bne .L289
-.L290:
- ldr r2, .L292+8
+ bne .L290
+.L291:
+ ldr r2, .L293+8
movs r0, #12
- ldr r1, .L292+12
+ ldr r1, .L293+12
ldrh r3, [r2]
ldr r1, [r1]
muls r0, r3, r0
@@ -2349,9 +2339,9 @@ FtlGcUpdatePage:
str r5, [r1, r0]
strh r3, [r2] @ movhi
pop {r3, r4, r5, r6, r7, pc}
-.L293:
+.L294:
.align 2
-.L292:
+.L293:
.word .LANCHOR69
.word .LANCHOR68
.word .LANCHOR70
@@ -2369,29 +2359,29 @@ FtlGcRefreshBlock:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, r5, lr}
- ldr r4, .L297
+ ldr r4, .L298
ldrh r5, [r4]
cmp r5, r0
- beq .L295
- ldr r3, .L297+4
+ beq .L296
+ ldr r3, .L298+4
ldrh r1, [r3]
cmp r0, r1
- beq .L295
+ beq .L296
movw r2, #65535
cmp r5, r2
- bne .L296
+ bne .L297
strh r0, [r4] @ movhi
-.L295:
+.L296:
movs r0, #0
pop {r4, r5, pc}
-.L296:
+.L297:
cmp r1, r2
it eq
strheq r0, [r3] @ movhi
- b .L295
-.L298:
+ b .L296
+.L299:
.align 2
-.L297:
+.L298:
.word .LANCHOR72
.word .LANCHOR73
.size FtlGcRefreshBlock, .-FtlGcRefreshBlock
@@ -2410,33 +2400,33 @@ FtlGcMarkBadPhyBlk:
mov r4, r0
bl P2V_block_in_plane
bl FtlGcRefreshBlock
- ldr r2, .L303
+ ldr r2, .L304
movs r1, #0
- ldr r5, .L303+4
+ ldr r5, .L304+4
ldrh r3, [r2]
-.L300:
+.L301:
uxth r0, r1
cmp r3, r0
- bhi .L302
+ bhi .L303
cmp r3, #15
itttt ls
addls r1, r3, #1
strhls r1, [r2] @ movhi
- ldrls r2, .L303+4
+ ldrls r2, .L304+4
strhls r4, [r2, r3, lsl #1] @ movhi
- b .L301
-.L302:
+ b .L302
+.L303:
adds r1, r1, #1
add r0, r5, r1, lsl #1
ldrh r0, [r0, #-2]
cmp r0, r4
- bne .L300
-.L301:
+ bne .L301
+.L302:
movs r0, #0
pop {r3, r4, r5, pc}
-.L304:
+.L305:
.align 2
-.L303:
+.L304:
.word .LANCHOR74
.word .LANCHOR75
.size FtlGcMarkBadPhyBlk, .-FtlGcMarkBadPhyBlk
@@ -2451,22 +2441,22 @@ FtlGcMarkBadPhyBlk:
FtlGcReFreshBadBlk:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L311
+ ldr r3, .L312
push {r4, lr}
ldrh r3, [r3]
- cbz r3, .L306
- ldr r2, .L311+4
+ cbz r3, .L307
+ ldr r2, .L312+4
ldrh r1, [r2]
movw r2, #65535
cmp r1, r2
- bne .L306
- ldr r4, .L311+8
+ bne .L307
+ ldr r4, .L312+8
ldrh r2, [r4]
cmp r2, r3
itt cs
movcs r3, #0
strhcs r3, [r4] @ movhi
- ldr r3, .L311+12
+ ldr r3, .L312+12
ldrh r2, [r4]
ldrh r0, [r3, r2, lsl #1]
bl P2V_block_in_plane
@@ -2474,12 +2464,12 @@ FtlGcReFreshBadBlk:
ldrh r3, [r4]
adds r3, r3, #1
strh r3, [r4] @ movhi
-.L306:
+.L307:
movs r0, #0
pop {r4, pc}
-.L312:
+.L313:
.align 2
-.L311:
+.L312:
.word .LANCHOR74
.word .LANCHOR72
.word .LANCHOR76
@@ -2533,48 +2523,48 @@ rknand_print_hex:
mov r10, r3
mov r5, r6
mov r4, r6
-.L316:
+.L317:
cmp r4, r10
- bcc .L322
- ldr r0, .L325
+ bcc .L323
+ ldr r0, .L326
pop {r4, r5, r6, r7, r8, r10, fp, lr}
b printf
-.L322:
- cbnz r5, .L317
+.L323:
+ cbnz r5, .L318
mov r2, r6
mov r1, fp
- ldr r0, .L325+4
+ ldr r0, .L326+4
bl printf
-.L317:
+.L318:
cmp r8, #4
- bne .L318
+ bne .L319
ldr r1, [r7, r4, lsl #2]
+.L325:
+ ldr r0, .L326+8
.L324:
- ldr r0, .L325+8
-.L323:
adds r5, r5, #1
bl printf
cmp r5, #15
- bls .L321
+ bls .L322
movs r5, #0
- ldr r0, .L325
+ ldr r0, .L326
bl printf
-.L321:
+.L322:
adds r4, r4, #1
add r6, r6, r8
- b .L316
-.L318:
+ b .L317
+.L319:
cmp r8, #2
- bne .L320
+ bne .L321
ldrh r1, [r7, r4, lsl #1]
- b .L324
-.L320:
+ b .L325
+.L321:
ldrb r1, [r7, r4] @ zero_extendqisi2
- ldr r0, .L325+12
- b .L323
-.L326:
+ ldr r0, .L326+12
+ b .L324
+.L327:
.align 2
-.L325:
+.L326:
.word .LC5
.word .LC2
.word .LC3
@@ -2593,41 +2583,41 @@ FlashEraseBlocks:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r10, fp, lr}
mov r4, r0
- ldr r6, .L343
+ ldr r6, .L344
add r8, r0, #4
movs r7, #0
- ldr fp, .L343+20
+ ldr fp, .L344+20
ldrh r10, [r6, #12]
str r2, [sp]
lsl r3, r10, #3
str r3, [sp, #4]
-.L328:
+.L329:
ldr r3, [sp]
cmp r7, r3
- beq .L342
+ beq .L343
add r2, sp, #8
add r1, sp, #12
ldr r0, [r8]
bl l2p_addr_tran.isra.0
ldr r5, [sp, #8]
- cbnz r5, .L329
+ cbnz r5, .L330
ldr r2, [sp, #12]
ldr r3, [sp, #4]
cmp r3, r2
- bls .L329
- ldr r6, .L343+4
- ldr r7, .L343+8
-.L330:
+ bls .L330
+ ldr r6, .L344+4
+ ldr r7, .L344+8
+.L331:
ldr r3, [sp]
adds r4, r4, #20
cmp r5, r3
- bne .L331
-.L342:
+ bne .L332
+.L343:
movs r0, #0
add sp, sp, #16
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L331:
+.L332:
mov r3, #-1
ldr r2, [sp, #12]
str r3, [r4, #-20]
@@ -2638,44 +2628,44 @@ FlashEraseBlocks:
movs r3, #16
movs r2, #4
ldr r1, [r4, #-12]
- ldr r0, .L343+12
+ ldr r0, .L344+12
bl rknand_print_hex
movs r3, #4
ldr r1, [r4, #-8]
mov r2, r3
- ldr r0, .L343+16
+ ldr r0, .L344+16
bl rknand_print_hex
- b .L330
-.L329:
+ b .L331
+.L330:
ldr r2, [fp, #4]
uxtb r0, r5
ldr r1, [sp, #12]
blx r2
- cbnz r0, .L332
+ cbnz r0, .L333
str r0, [r8, #-4]
-.L333:
+.L334:
ldrh r2, [r6, #14]
cmp r2, #4
- bne .L335
+ bne .L336
ldr r1, [sp, #12]
ldr r2, [fp, #4]
ldrb r0, [sp, #8] @ zero_extendqisi2
add r1, r1, r10
blx r2
- cbz r0, .L335
+ cbz r0, .L336
mov r2, #-1
str r2, [r8, #-4]
-.L335:
+.L336:
adds r7, r7, #1
add r8, r8, #20
- b .L328
-.L332:
+ b .L329
+.L333:
mov r2, #-1
str r2, [r8, #-4]
- b .L333
-.L344:
+ b .L334
+.L345:
.align 2
-.L343:
+.L344:
.word .LANCHOR0
.word .LANCHOR77
.word .LC6
@@ -2700,14 +2690,14 @@ FtlFreeSysBlkQueueIn:
push {r4, r5, r6, lr}
mov r5, r0
cmp r3, r2
- bhi .L345
- ldr r4, .L354
+ bhi .L346
+ ldr r4, .L355
ldrh r3, [r4, #6]
cmp r3, #1024
- beq .L345
- cbz r1, .L347
+ beq .L346
+ cbz r1, .L348
bl P2V_block_in_plane
- ldr r3, .L354+4
+ ldr r3, .L355+4
mov r6, r0
movs r2, #1
mov r1, r2
@@ -2715,16 +2705,16 @@ FtlFreeSysBlkQueueIn:
lsls r3, r5, #10
str r3, [r0, #4]
bl FlashEraseBlocks
- ldr r3, .L354+8
+ ldr r3, .L355+8
ldr r2, [r3]
ldrh r3, [r2, r6, lsl #1]
adds r3, r3, #1
strh r3, [r2, r6, lsl #1] @ movhi
- ldr r2, .L354+12
+ ldr r2, .L355+12
ldr r3, [r2]
adds r3, r3, #1
str r3, [r2]
-.L347:
+.L348:
ldrh r3, [r4, #6]
adds r3, r3, #1
strh r3, [r4, #6] @ movhi
@@ -2734,14 +2724,14 @@ FtlFreeSysBlkQueueIn:
ubfx r3, r3, #0, #10
strh r5, [r4, r2, lsl #1] @ movhi
strh r3, [r4, #4] @ movhi
-.L345:
+.L346:
pop {r4, r5, r6, pc}
-.L355:
+.L356:
.align 2
-.L354:
+.L355:
.word .LANCHOR38
.word .LANCHOR79
- .word .LANCHOR43
+ .word .LANCHOR47
.word .LANCHOR80
.size FtlFreeSysBlkQueueIn, .-FtlFreeSysBlkQueueIn
.section .text.FtlFreeSysBlkQueueOut,"ax",%progbits
@@ -2756,9 +2746,9 @@ FtlFreeSysBlkQueueOut:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, lr}
- ldr r4, .L361
+ ldr r4, .L362
ldrh r2, [r4, #6]
- cbz r2, .L360
+ cbz r2, .L361
ldrh r3, [r4, #2]
subs r2, r2, #1
strh r2, [r4, #6] @ movhi
@@ -2769,36 +2759,36 @@ FtlFreeSysBlkQueueOut:
ldrh r5, [r4, r1, lsl #1]
strh r3, [r4, #2] @ movhi
mov r1, r2
- ldr r3, .L361+4
+ ldr r3, .L362+4
ldr r0, [r3]
lsls r3, r5, #10
str r3, [r0, #4]
bl FlashEraseBlocks
- ldr r2, .L361+8
+ ldr r2, .L362+8
ldr r3, [r2]
adds r3, r3, #1
str r3, [r2]
-.L357:
+.L358:
subs r3, r5, #1
movw r2, #65533
uxth r3, r3
cmp r3, r2
- bls .L358
+ bls .L359
ldrh r2, [r4, #6]
mov r1, r5
- ldr r0, .L361+12
+ ldr r0, .L362+12
bl printf
-.L359:
- b .L359
.L360:
+ b .L360
+.L361:
movw r5, #65535
- b .L357
-.L358:
+ b .L358
+.L359:
mov r0, r5
pop {r3, r4, r5, pc}
-.L362:
+.L363:
.align 2
-.L361:
+.L362:
.word .LANCHOR38
.word .LANCHOR79
.word .LANCHOR80
@@ -2820,16 +2810,16 @@ ftl_map_blk_alloc_new_blk:
push {r3, r4, r5, r6, r7, lr}
mov r4, r0
movs r3, #0
-.L364:
+.L365:
uxth r5, r3
cmp r5, r1
- bcs .L367
+ bcs .L368
mov r7, r2
adds r3, r3, #1
ldrh r6, [r7]
adds r2, r2, #2
cmp r6, #0
- bne .L364
+ bne .L365
bl FtlFreeSysBlkQueueOut
subs r3, r0, #1
movw r2, #65533
@@ -2837,14 +2827,14 @@ ftl_map_blk_alloc_new_blk:
mov r1, r0
strh r0, [r7] @ movhi
cmp r3, r2
- bls .L365
- ldr r3, .L371
- ldr r0, .L371+4
+ bls .L366
+ ldr r3, .L372
+ ldr r0, .L372+4
ldrh r2, [r3, #6]
bl printf
+.L367:
+ b .L367
.L366:
- b .L366
-.L365:
ldr r3, [r4, #28]
strh r6, [r4, #2] @ movhi
strh r5, [r4] @ movhi
@@ -2853,20 +2843,20 @@ ftl_map_blk_alloc_new_blk:
ldrh r3, [r4, #8]
adds r3, r3, #1
strh r3, [r4, #8] @ movhi
-.L367:
+.L368:
ldrh r3, [r4, #10]
cmp r3, r5
- bhi .L369
+ bhi .L370
movw r2, #578
- ldr r1, .L371+8
- ldr r0, .L371+12
+ ldr r1, .L372+8
+ ldr r0, .L372+12
bl printf
-.L369:
+.L370:
movs r0, #0
pop {r3, r4, r5, r6, r7, pc}
-.L372:
+.L373:
.align 2
-.L371:
+.L372:
.word .LANCHOR38
.word .LC10
.word .LANCHOR81
@@ -2897,102 +2887,102 @@ ftl_memset:
FtlMemInit:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L379
+ ldr r3, .L380
push {r4, r5, r6, r7, r8, r10, fp, lr}
movs r4, #0
- ldr r2, .L379+4
+ ldr r2, .L380+4
movs r6, #12
str r4, [r3]
- ldr r3, .L379+8
- ldr r5, .L379+12
- ldr r10, .L379+292
+ ldr r3, .L380+8
+ ldr r5, .L380+12
+ ldr r10, .L380+292
str r4, [r3]
- ldr r3, .L379+16
+ ldr r3, .L380+16
ldrh r0, [r5]
- ldr r8, .L379+296
+ ldr r8, .L380+296
str r4, [r3]
- ldr r3, .L379+20
+ ldr r3, .L380+20
lsls r0, r0, #1
- ldr fp, .L379+300
+ ldr fp, .L380+300
str r4, [r3]
- ldr r3, .L379+24
+ ldr r3, .L380+24
str r4, [r3]
- ldr r3, .L379+28
+ ldr r3, .L380+28
str r4, [r3]
- ldr r3, .L379+32
+ ldr r3, .L380+32
str r4, [r3]
- ldr r3, .L379+36
+ ldr r3, .L380+36
str r4, [r3]
- ldr r3, .L379+40
+ ldr r3, .L380+40
str r4, [r3]
- ldr r3, .L379+44
+ ldr r3, .L380+44
str r4, [r3]
- ldr r3, .L379+48
+ ldr r3, .L380+48
str r4, [r3]
- ldr r3, .L379+52
+ ldr r3, .L380+52
str r4, [r3]
- ldr r3, .L379+56
+ ldr r3, .L380+56
str r4, [r3]
- ldr r3, .L379+60
+ ldr r3, .L380+60
str r4, [r3]
- ldr r3, .L379+64
+ ldr r3, .L380+64
str r4, [r3]
movw r3, #65535
str r3, [r2]
- ldr r2, .L379+68
+ ldr r2, .L380+68
str r4, [r2]
- ldr r2, .L379+72
+ ldr r2, .L380+72
str r4, [r2]
- ldr r2, .L379+76
+ ldr r2, .L380+76
str r4, [r2]
- ldr r2, .L379+80
+ ldr r2, .L380+80
strh r3, [r2] @ movhi
- ldr r2, .L379+84
+ ldr r2, .L380+84
strh r3, [r2] @ movhi
movs r2, #32
- ldr r3, .L379+88
+ ldr r3, .L380+88
strh r2, [r3] @ movhi
movs r2, #128
- ldr r3, .L379+92
+ ldr r3, .L380+92
strh r2, [r3] @ movhi
- ldr r3, .L379+96
+ ldr r3, .L380+96
strh r4, [r3] @ movhi
- ldr r3, .L379+100
+ ldr r3, .L380+100
strh r4, [r3] @ movhi
- ldr r3, .L379+104
+ ldr r3, .L380+104
strh r4, [r3] @ movhi
bl ftl_malloc
- ldr r3, .L379+108
+ ldr r3, .L380+108
str r0, [r3]
ldrh r0, [r5]
movs r5, #20
muls r0, r6, r0
bl ftl_malloc
- ldr r3, .L379+112
+ ldr r3, .L380+112
str r0, [r3]
ldrh r3, [r10]
muls r5, r3, r5
lsls r7, r5, #2
mov r0, r7
bl ftl_malloc
- ldr r3, .L379+116
+ ldr r3, .L380+116
str r0, [r3]
mov r0, r5
bl ftl_malloc
- ldr r3, .L379+120
+ ldr r3, .L380+120
str r0, [r3]
mov r0, r7
bl ftl_malloc
- ldr r3, .L379+124
- ldr r7, .L379+128
+ ldr r3, .L380+124
+ ldr r7, .L380+128
str r0, [r3]
mov r0, r5
bl ftl_malloc
- ldr r3, .L379+132
+ ldr r3, .L380+132
str r0, [r3]
mov r0, r5
bl ftl_malloc
- ldr r3, .L379+136
+ ldr r3, .L380+136
ldrh r5, [r7]
str r0, [r3]
ldrh r3, [r10]
@@ -3001,166 +2991,166 @@ FtlMemInit:
adds r3, r3, #1
str r3, [r8]
bl ftl_malloc
- ldr r3, .L379+140
+ ldr r3, .L380+140
str r0, [r3]
mov r0, r5
bl ftl_malloc
- ldr r3, .L379+144
+ ldr r3, .L380+144
str r0, [r3]
mov r0, r5
bl ftl_malloc
- ldr r3, .L379+148
+ ldr r3, .L380+148
str r0, [r3]
ldr r0, [r8]
muls r0, r5, r0
bl ftl_malloc
- ldr r3, .L379+152
+ ldr r3, .L380+152
str r0, [r3]
mov r0, r5
bl ftl_malloc
- ldr r3, .L379+156
+ ldr r3, .L380+156
str r0, [r3]
mov r0, r5
bl ftl_malloc
- ldr r3, .L379+160
+ ldr r3, .L380+160
str r0, [r3]
ldr r0, [r8]
muls r0, r6, r0
bl ftl_malloc
- ldr r3, .L379+164
+ ldr r3, .L380+164
str r0, [r3]
mov r0, r5
bl ftl_malloc
- ldr r3, .L379+168
+ ldr r3, .L380+168
str r0, [r3]
mov r0, r5
bl ftl_malloc
- ldr r3, .L379+172
+ ldr r3, .L380+172
str r0, [r3]
- ldr r3, .L379+176
+ ldr r3, .L380+176
ldrh r0, [r3]
lsls r0, r0, #2
bl ftl_malloc
- ldr r3, .L379+180
+ ldr r3, .L380+180
ldrh r5, [r10]
- ldr r10, .L379+304
+ ldr r10, .L380+304
str r0, [r3]
ldrh r3, [fp]
muls r5, r3, r5
mov r0, r5
bl ftl_malloc
- ldr r3, .L379+184
+ ldr r3, .L380+184
str r0, [r3]
lsls r0, r5, #2
- ldr r5, .L379+188
+ ldr r5, .L380+188
bl ftl_malloc
- ldr r3, .L379+192
+ ldr r3, .L380+192
str r0, [r3]
ldrh r3, [fp]
ldr r0, [r8]
- ldr r8, .L379+308
+ ldr r8, .L380+308
muls r0, r3, r0
bl ftl_malloc
- ldr r3, .L379+196
+ ldr r3, .L380+196
str r0, [r3]
ldrh r0, [r5]
lsls r0, r0, #1
uxth r0, r0
strh r0, [r8] @ movhi
bl ftl_malloc
- ldr r3, .L379+200
+ ldr r3, .L380+200
str r0, [r3]
ldrh r3, [r8]
- ldr r0, .L379+204
+ ldr r0, .L380+204
addw r3, r3, #547
lsrs r3, r3, #9
and r0, r0, r3, lsl #9
strh r3, [r8] @ movhi
bl ftl_malloc
- ldr r3, .L379+208
+ ldr r3, .L380+208
str r0, [r3]
adds r0, r0, #32
- ldr r3, .L379+212
+ ldr r3, .L380+212
str r0, [r3]
ldrh r0, [r5]
lsls r0, r0, #1
bl ftl_malloc
- ldr r3, .L379+216
+ ldr r3, .L380+216
str r0, [r3]
ldr r3, [r10]
lsl r8, r3, #1
mov r0, r8
bl ftl_malloc
- ldr r3, .L379+220
+ ldr r3, .L380+220
str r0, [r3]
mov r0, r8
bl ftl_malloc
- ldr r3, .L379+224
- ldr r8, .L379+312
+ ldr r3, .L380+224
+ ldr r8, .L380+312
str r0, [r3]
ldrh r0, [r5]
lsrs r0, r0, #3
adds r0, r0, #4
bl ftl_malloc
- ldr r3, .L379+228
+ ldr r3, .L380+228
str r0, [r3]
ldrh r0, [r8]
lsls r0, r0, #1
bl ftl_malloc
- ldr r3, .L379+232
+ ldr r3, .L380+232
str r0, [r3]
ldrh r0, [r8]
lsls r0, r0, #1
bl ftl_malloc
- ldr r3, .L379+236
+ ldr r3, .L380+236
str r0, [r3]
ldrh r0, [r8]
- ldr r8, .L379+316
+ ldr r8, .L380+316
lsls r0, r0, #2
bl ftl_malloc
- ldr r3, .L379+240
+ ldr r3, .L380+240
str r0, [r3]
ldrh r0, [r8]
lsls r0, r0, #2
bl ftl_malloc
ldrh r2, [r8]
mov r1, r4
- ldr r3, .L379+244
- ldr r4, .L379+248
+ ldr r3, .L380+244
+ ldr r4, .L380+248
lsls r2, r2, #2
str r0, [r3]
bl ftl_memset
- ldr r3, .L379+252
+ ldr r3, .L380+252
ldrh r0, [r3]
lsls r0, r0, #2
bl ftl_malloc
- ldr r3, .L379+256
+ ldr r3, .L380+256
str r0, [r3]
ldr r0, [r10]
lsls r0, r0, #2
bl ftl_malloc
- ldr r3, .L379+260
+ ldr r3, .L380+260
str r0, [r3]
ldrh r0, [r4]
muls r0, r6, r0
- ldr r6, .L379+264
+ ldr r6, .L380+264
bl ftl_malloc
- ldr r3, .L379+268
+ ldr r3, .L380+268
str r0, [r3]
ldrh r3, [r4]
ldrh r0, [r7]
muls r0, r3, r0
bl ftl_malloc
- ldr r3, .L379+272
+ ldr r3, .L380+272
str r0, [r3]
movs r0, #6
ldrh r3, [r5]
- ldr r5, .L379+276
+ ldr r5, .L380+276
muls r0, r3, r0
bl ftl_malloc
- ldr r3, .L379+280
+ ldr r3, .L380+280
str r0, [r3]
- ldr r3, .L379+284
+ ldr r3, .L380+284
ldrh r0, [r3]
ldrh r3, [r6]
adds r0, r0, #31
@@ -3171,16 +3161,16 @@ FtlMemInit:
bl ftl_malloc
ldrh r1, [r5]
movs r2, #1
- ldr r3, .L379+288
+ ldr r3, .L380+288
ldrh r6, [r6]
lsls r1, r1, #2
mov r4, r3
str r0, [r4, #28]!
mov r0, r1
- b .L380
-.L381:
+ b .L381
+.L382:
.align 2
-.L379:
+.L380:
.word .LANCHOR82
.word .LANCHOR96
.word .LANCHOR83
@@ -3234,7 +3224,7 @@ FtlMemInit:
.word .LANCHOR117
.word 33553920
.word .LANCHOR118
- .word .LANCHOR43
+ .word .LANCHOR47
.word .LANCHOR42
.word .LANCHOR119
.word .LANCHOR120
@@ -3261,32 +3251,32 @@ FtlMemInit:
.word .LANCHOR116
.word .LANCHOR27
.word .LANCHOR28
-.L380:
-.L375:
+.L381:
+.L376:
cmp r2, r6
- bcc .L376
+ bcc .L377
add r3, r3, r2, lsl #2
- ldr r2, .L382
+ ldr r2, .L383
movs r1, #0
adds r3, r3, #24
-.L377:
+.L378:
cmp r3, r2
- bne .L378
+ bne .L379
movs r0, #0
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L376:
+.L377:
ldr r5, [r3, #28]
adds r2, r2, #1
add r5, r5, r0
add r0, r0, r1
str r5, [r4, #4]!
- b .L375
-.L378:
+ b .L376
+.L379:
str r1, [r3, #4]!
- b .L377
-.L383:
+ b .L378
+.L384:
.align 2
-.L382:
+.L383:
.word .LANCHOR37+56
.size FtlMemInit, .-FtlMemInit
.section .text.FtlBbt2Bitmap,"ax",%progbits
@@ -3300,32 +3290,32 @@ FtlMemInit:
FtlBbt2Bitmap:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L390
+ ldr r3, .L391
push {r4, r5, r6, r7, r8, lr}
mov r5, r0
- ldr r7, .L390+4
+ ldr r7, .L391+4
mov r6, r1
subs r4, r5, #2
addw r5, r5, #1022
ldrh r2, [r3]
movs r1, #0
- ldr r8, .L390+12
+ ldr r8, .L391+12
mov r0, r6
lsls r2, r2, #2
bl ftl_memset
-.L387:
+.L388:
ldrh r3, [r4, #2]
movw r2, #65535
cmp r3, r2
- beq .L384
+ beq .L385
ldrh r2, [r7]
cmp r2, r3
- bhi .L386
+ bhi .L387
movs r2, #74
mov r1, r8
- ldr r0, .L390+8
+ ldr r0, .L391+8
bl printf
-.L386:
+.L387:
ldrh r3, [r4, #2]!
movs r2, #1
cmp r5, r4
@@ -3335,12 +3325,12 @@ FtlBbt2Bitmap:
ldr r2, [r6, r1, lsl #2]
orr r2, r2, r3
str r2, [r6, r1, lsl #2]
- bne .L387
-.L384:
+ bne .L388
+.L385:
pop {r4, r5, r6, r7, r8, pc}
-.L391:
+.L392:
.align 2
-.L390:
+.L391:
.word .LANCHOR127
.word .LANCHOR17
.word .LC1
@@ -3358,7 +3348,7 @@ FtlBbtMemInit:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
- ldr r0, .L393
+ ldr r0, .L394
movw r3, #65535
movs r2, #16
movs r1, #255
@@ -3367,9 +3357,9 @@ FtlBbtMemInit:
strh r3, [r0, #6] @ movhi
adds r0, r0, #12
b ftl_memset
-.L394:
+.L395:
.align 2
-.L393:
+.L394:
.word .LANCHOR37
.size FtlBbtMemInit, .-FtlBbtMemInit
.section .text.FtlFreeSysBlkQueueInit,"ax",%progbits
@@ -3383,7 +3373,7 @@ FtlBbtMemInit:
FtlFreeSysBlkQueueInit:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L396
+ ldr r3, .L397
mov r2, #2048
push {r4, lr}
movs r4, #0
@@ -3396,9 +3386,9 @@ FtlFreeSysBlkQueueInit:
bl ftl_memset
mov r0, r4
pop {r4, pc}
-.L397:
+.L398:
.align 2
-.L396:
+.L397:
.word .LANCHOR38
.size FtlFreeSysBlkQueueInit, .-FtlFreeSysBlkQueueInit
.section .text.ftl_free_no_use_map_blk,"ax",%progbits
@@ -3423,12 +3413,12 @@ ftl_free_no_use_map_blk:
mov r0, r5
bl ftl_memset
movs r3, #0
-.L399:
+.L400:
ldrh r1, [r4, #6]
uxth r2, r3
cmp r1, r2
- bhi .L403
- ldr r3, .L418
+ bhi .L404
+ ldr r3, .L419
movs r6, #0
mov r10, r6
ldrh r2, [r3]
@@ -3436,59 +3426,59 @@ ftl_free_no_use_map_blk:
strh r2, [r5, r3, lsl #1] @ movhi
mov r2, r6
ldrh fp, [r5]
-.L404:
+.L405:
ldrh r3, [r4, #10]
uxth ip, r6
cmp r3, ip
- bhi .L408
+ bhi .L409
mov r0, r10
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L403:
+.L404:
uxth r2, r3
ldr r1, [r6, r2, lsl #2]
movs r2, #0
ubfx r1, r1, #10, #16
-.L400:
+.L401:
ldrh ip, [r4, #10]
uxth r0, r2
cmp ip, r0
- bhi .L402
+ bhi .L403
adds r3, r3, #1
- b .L399
-.L402:
+ b .L400
+.L403:
uxth r0, r2
ldrh ip, [r7, r0, lsl #1]
cmp ip, r1
- bne .L401
- cbz r1, .L401
+ bne .L402
+ cbz r1, .L402
ldrh ip, [r5, r0, lsl #1]
add ip, ip, #1
strh ip, [r5, r0, lsl #1] @ movhi
-.L401:
+.L402:
adds r2, r2, #1
- b .L400
-.L408:
+ b .L401
+.L409:
uxth r1, r6
ldrh r3, [r5, r1, lsl #1]
lsl r8, r1, #1
cmp fp, r3
- bls .L405
+ bls .L406
ldrh r0, [r7, r1, lsl #1]
add r8, r8, r7
- cbnz r0, .L406
-.L407:
+ cbnz r0, .L407
+.L408:
adds r6, r6, #1
- b .L404
-.L405:
+ b .L405
+.L406:
cmp r3, #0
- bne .L407
+ bne .L408
ldrh r0, [r7, r1, lsl #1]
add r8, r8, r7
cmp r0, #0
- beq .L407
-.L409:
+ beq .L408
+.L410:
movs r1, #1
str r2, [sp, #4]
bl FtlFreeSysBlkQueueIn
@@ -3497,16 +3487,16 @@ ftl_free_no_use_map_blk:
ldrh r3, [r4, #8]
subs r3, r3, #1
strh r3, [r4, #8] @ movhi
- b .L407
-.L406:
+ b .L408
+.L407:
mov r10, ip
mov fp, r3
cmp r3, #0
- beq .L409
- b .L407
-.L419:
+ beq .L410
+ b .L408
+.L420:
.align 2
-.L418:
+.L419:
.word .LANCHOR20
.size ftl_free_no_use_map_blk, .-ftl_free_no_use_map_blk
.section .text.FtlL2PDataInit,"ax",%progbits
@@ -3522,14 +3512,14 @@ FtlL2PDataInit:
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, r5, r6, r7, r8, lr}
movs r1, #0
- ldr r5, .L423
- ldr r4, .L423+4
+ ldr r5, .L424
+ ldr r4, .L424+4
ldr r2, [r5]
- ldr r7, .L423+8
- ldr r6, .L423+12
+ ldr r7, .L424+8
+ ldr r6, .L424+12
ldr r0, [r4]
lsls r2, r2, #1
- ldr r8, .L423+44
+ ldr r8, .L424+44
bl ftl_memset
ldrh r3, [r7]
movs r1, #255
@@ -3537,7 +3527,7 @@ FtlL2PDataInit:
ldr r0, [r8]
muls r2, r3, r2
bl ftl_memset
- ldr r3, .L423+16
+ ldr r3, .L424+16
movw r0, #65535
ldrh r1, [r6]
ldr ip, [r8]
@@ -3548,47 +3538,47 @@ FtlL2PDataInit:
adds r1, r2, r3
movs r3, #0
mov lr, r3
-.L421:
+.L422:
adds r2, r2, #12
adds r6, r3, r7
cmp r2, r1
- bne .L422
- ldr r3, .L423+20
+ bne .L423
+ ldr r3, .L424+20
ldr r2, [r5]
strh r0, [r3, #2] @ movhi
strh r2, [r3, #10] @ movhi
movw r2, #61634
strh r2, [r3, #4] @ movhi
- ldr r2, .L423+24
+ ldr r2, .L424+24
strh r0, [r3] @ movhi
ldrh r2, [r2]
strh r2, [r3, #8] @ movhi
- ldr r2, .L423+28
+ ldr r2, .L424+28
ldrh r2, [r2]
strh r2, [r3, #6] @ movhi
- ldr r2, .L423+32
+ ldr r2, .L424+32
ldr r2, [r2]
str r2, [r3, #12]
- ldr r2, .L423+36
+ ldr r2, .L424+36
ldr r2, [r2]
str r2, [r3, #16]
ldr r2, [r4]
str r2, [r3, #20]
- ldr r2, .L423+40
+ ldr r2, .L424+40
ldr r2, [r2]
str r2, [r3, #24]
pop {r4, r5, r6, r7, r8, pc}
-.L422:
+.L423:
bic r3, r3, #3
str lr, [r2, #-8]
add r3, r3, ip
strh r0, [r2, #-12] @ movhi
str r3, [r2, #-4]
mov r3, r6
- b .L421
-.L424:
+ b .L422
+.L425:
.align 2
-.L423:
+.L424:
.word .LANCHOR30
.word .LANCHOR120
.word .LANCHOR23
@@ -3615,53 +3605,53 @@ FtlVariablesInit:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, lr}
movw r2, #65535
- ldr r3, .L426
+ ldr r3, .L427
movs r4, #0
mov r1, r4
- ldr r5, .L426+4
+ ldr r5, .L427+4
strh r2, [r3] @ movhi
mov r2, #-1
- ldr r3, .L426+8
+ ldr r3, .L427+8
str r4, [r3]
- ldr r3, .L426+12
+ ldr r3, .L427+12
str r4, [r3]
- ldr r3, .L426+16
+ ldr r3, .L427+16
str r2, [r3]
- ldr r3, .L426+20
+ ldr r3, .L427+20
strh r4, [r3] @ movhi
- ldr r3, .L426+24
+ ldr r3, .L427+24
ldrh r2, [r3]
- ldr r3, .L426+28
+ ldr r3, .L427+28
lsls r2, r2, #1
ldr r0, [r3]
bl ftl_memset
ldrh r2, [r5]
mov r1, r4
- ldr r3, .L426+32
+ ldr r3, .L427+32
lsls r2, r2, #1
ldr r0, [r3]
bl ftl_memset
ldrh r2, [r5]
mov r1, r4
- ldr r3, .L426+36
+ ldr r3, .L427+36
lsls r2, r2, #1
ldr r0, [r3]
bl ftl_memset
mov r1, r4
movs r2, #48
- ldr r0, .L426+40
+ ldr r0, .L427+40
bl ftl_memset
mov r2, #512
mov r1, r4
- ldr r0, .L426+44
+ ldr r0, .L427+44
bl ftl_memset
bl FtlGcBufInit
bl FtlL2PDataInit
mov r0, r4
pop {r3, r4, r5, pc}
-.L427:
+.L428:
.align 2
-.L426:
+.L427:
.word .LANCHOR131
.word .LANCHOR6
.word .LANCHOR132
@@ -3670,7 +3660,7 @@ FtlVariablesInit:
.word .LANCHOR35
.word .LANCHOR27
.word .LANCHOR36
- .word .LANCHOR43
+ .word .LANCHOR47
.word .LANCHOR117
.word .LANCHOR39
.word .LANCHOR135
@@ -3688,10 +3678,10 @@ SupperBlkListInit:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r10, fp, lr}
movs r2, #6
- ldr r3, .L439
+ ldr r3, .L440
movs r1, #0
movs r4, #0
- ldr r6, .L439+4
+ ldr r6, .L440+4
mov r8, r4
ldrh r3, [r3]
mov r5, r4
@@ -3699,125 +3689,125 @@ SupperBlkListInit:
mov r10, r6
muls r2, r3, r2
bl ftl_memset
- ldr r3, .L439+8
- ldr r2, .L439+12
+ ldr r3, .L440+8
+ ldr r2, .L440+12
str r4, [r3]
- ldr r3, .L439+16
+ ldr r3, .L440+16
strh r4, [r2] @ movhi
str r2, [sp, #4]
str r4, [r3]
- ldr r3, .L439+20
+ ldr r3, .L440+20
str r4, [r3]
- ldr r3, .L439+24
+ ldr r3, .L440+24
mov fp, r3
strh r4, [r3] @ movhi
-.L429:
- ldr r3, .L439+28
+.L430:
+ ldr r3, .L440+28
uxth r7, r4
ldrh r3, [r3]
cmp r7, r3
- bcs .L436
- ldr r3, .L439+32
+ bcs .L437
+ ldr r3, .L440+32
ldrh r2, [r3]
- ldr r3, .L439+36
+ ldr r3, .L440+36
ldrh r3, [r3]
str r3, [sp]
movs r3, #0
mov r6, r3
- b .L437
-.L431:
+ b .L438
+.L432:
str r2, [sp, #12]
mov r1, r7
- ldr r2, .L439+40
+ ldr r2, .L440+40
str r3, [sp, #8]
ldrb r0, [r2, r3] @ zero_extendqisi2
bl V2P_block
bl FtlBbmIsBadBlock
ldr r3, [sp, #8]
ldr r2, [sp, #12]
- cbnz r0, .L430
+ cbnz r0, .L431
ldr r1, [sp]
add r6, r6, r1
uxth r6, r6
-.L430:
+.L431:
adds r3, r3, #1
-.L437:
+.L438:
uxth r1, r3
cmp r2, r1
- bhi .L431
+ bhi .L432
uxth r3, r4
- cbz r6, .L432
+ cbz r6, .L433
mov r1, r6
str r3, [sp]
mov r0, #32768
bl __aeabi_idiv
ldr r3, [sp]
uxth r6, r0
-.L433:
+.L434:
ldr r1, [r10]
movs r2, #6
mla r2, r2, r3, r1
strh r6, [r2, #4] @ movhi
- ldr r2, .L439+44
+ ldr r2, .L440+44
ldrh r2, [r2]
cmp r2, r7
- beq .L434
- ldr r2, .L439+48
+ beq .L435
+ ldr r2, .L440+48
ldrh r2, [r2]
cmp r2, r7
- beq .L434
- ldr r2, .L439+52
+ beq .L435
+ ldr r2, .L440+52
ldrh r2, [r2]
cmp r2, r7
- beq .L434
- ldr r2, .L439+56
+ beq .L435
+ ldr r2, .L440+56
ldr r2, [r2]
ldrh r3, [r2, r3, lsl #1]
- cbnz r3, .L435
+ cbnz r3, .L436
add r8, r8, #1
mov r0, r7
uxth r8, r8
bl INSERT_FREE_LIST
-.L434:
+.L435:
adds r4, r4, #1
- b .L429
-.L432:
- ldr r2, .L439+56
+ b .L430
+.L433:
+ ldr r2, .L440+56
movw r1, #65535
ldr r2, [r2]
strh r1, [r2, r3, lsl #1] @ movhi
- b .L433
-.L435:
+ b .L434
+.L436:
adds r5, r5, #1
mov r0, r7
uxth r5, r5
bl INSERT_DATA_LIST
- b .L434
-.L436:
+ b .L435
+.L437:
ldr r2, [sp, #4]
strh r8, [fp] @ movhi
strh r5, [r2] @ movhi
add r5, r5, r8
cmp r5, r3
- ble .L438
- movw r2, #2216
- ldr r1, .L439+60
- ldr r0, .L439+64
+ ble .L439
+ movw r2, #2210
+ ldr r1, .L440+60
+ ldr r0, .L440+64
bl printf
-.L438:
+.L439:
movs r0, #0
add sp, sp, #16
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L440:
+.L441:
.align 2
-.L439:
+.L440:
.word .LANCHOR6
.word .LANCHOR40
- .word .LANCHOR47
- .word .LANCHOR45
- .word .LANCHOR41
+ .word .LANCHOR46
.word .LANCHOR44
+ .word .LANCHOR41
+ .word .LANCHOR43
.word .LANCHOR48
.word .LANCHOR5
.word .LANCHOR3
@@ -3841,16 +3831,16 @@ SupperBlkListInit:
FtlGcPageVarInit:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r2, .L442
+ ldr r2, .L443
movs r3, #0
push {r4, lr}
movs r1, #255
- ldr r4, .L442+4
+ ldr r4, .L443+4
strh r3, [r2] @ movhi
- ldr r2, .L442+8
+ ldr r2, .L443+8
strh r3, [r2] @ movhi
ldrh r2, [r4]
- ldr r3, .L442+12
+ ldr r3, .L443+12
lsls r2, r2, #1
ldr r0, [r3]
bl ftl_memset
@@ -3858,14 +3848,14 @@ FtlGcPageVarInit:
movs r2, #12
movs r1, #255
muls r2, r3, r2
- ldr r3, .L442+16
+ ldr r3, .L443+16
ldr r0, [r3]
bl ftl_memset
pop {r4, lr}
b FtlGcBufInit
-.L443:
+.L444:
.align 2
-.L442:
+.L443:
.word .LANCHOR69
.word .LANCHOR21
.word .LANCHOR70
@@ -3889,39 +3879,39 @@ FlashGetBadBlockList:
movs r1, #255
mov r4, r0
bl ftl_memset
- ldr r3, .L451
+ ldr r3, .L452
mov r1, r5
mov r0, r4
ldr r3, [r3]
blx r3
uxth r0, r0
cmp r0, #50
- bls .L445
+ bls .L446
mov r2, #256
movs r1, #255
mov r0, r4
bl ftl_memset
movs r0, #0
-.L445:
- ldr r3, .L451+4
+.L446:
+ ldr r3, .L452+4
ldrh r3, [r3, #14]
cmp r3, #4
- bne .L450
+ bne .L451
add r1, r4, r0, lsl #1
mov r3, r4
-.L447:
+.L448:
cmp r3, r1
- bne .L448
-.L450:
+ bne .L449
+.L451:
pop {r3, r4, r5, pc}
-.L448:
+.L449:
ldrh r2, [r3]
lsrs r2, r2, #1
strh r2, [r3], #2 @ movhi
- b .L447
-.L452:
+ b .L448
+.L453:
.align 2
-.L451:
+.L452:
.word .LANCHOR78
.word .LANCHOR0
.size FlashGetBadBlockList, .-FlashGetBadBlockList
@@ -3952,48 +3942,48 @@ FlashReadPages:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r10, fp, lr}
mov fp, r1
- ldr r3, .L482
+ ldr r3, .L495
mov r4, r0
mov r10, #0
ldrh r2, [r3, #12]
str r3, [sp, #4]
str r2, [sp]
-.L455:
+.L456:
cmp r10, fp
- bne .L466
+ bne .L470
movs r0, #0
add sp, sp, #16
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L466:
+.L470:
ldr r3, [r4, #8]
- cbz r3, .L456
+ cbz r3, .L457
ldr r3, [r4, #12]
- cbnz r3, .L457
-.L456:
+ cbnz r3, .L458
+.L457:
movs r2, #90
- ldr r1, .L482+4
- ldr r0, .L482+8
+ ldr r1, .L495+4
+ ldr r0, .L495+8
bl printf
-.L457:
+.L458:
add r2, sp, #8
add r1, sp, #12
ldr r0, [r4, #4]
bl l2p_addr_tran.isra.0
ldr r0, [sp, #8]
cmp r0, #3
- bls .L458
+ bls .L459
mov r3, #-1
str r3, [r4]
-.L459:
+.L460:
add r10, r10, #1
adds r4, r4, #20
- b .L455
-.L458:
+ b .L456
+.L459:
ldr r5, [r4, #8]
uxtb r0, r0
- ldr r8, .L482+20
- ldr r7, .L482+12
+ ldr r8, .L495+32
+ ldr r7, .L495+12
tst r5, #63
ldr r3, [r4, #12]
it ne
@@ -4006,7 +3996,7 @@ FlashReadPages:
str r0, [r4]
ldrh r3, [r3, #14]
cmp r3, #4
- bne .L462
+ bne .L463
ldr r0, [sp]
add r2, r5, #2048
ldr r3, [r4, #12]
@@ -4016,48 +4006,75 @@ FlashReadPages:
add r1, r1, r0
ldrb r0, [sp, #8] @ zero_extendqisi2
blx r7
- adds r3, r0, #1
- beq .L463
+ adds r1, r0, #1
+ beq .L464
ldr r3, [r4, #12]
ldr r2, [r3, #12]
adds r2, r2, #1
- bne .L464
+ bne .L465
ldr r2, [r3, #8]
adds r2, r2, #1
- bne .L464
+ bne .L465
ldr r3, [r3]
adds r3, r3, #1
- beq .L464
-.L463:
+ beq .L465
+.L464:
mov r3, #-1
str r3, [r4]
-.L464:
+.L465:
ldr r3, [r4]
adds r3, r3, #1
- beq .L462
+ beq .L466
cmp r0, #256
it eq
streq r0, [r4]
-.L462:
+.L466:
+ ldr r3, [r4]
+ adds r2, r3, #1
+ beq .L467
+ cmp r3, #256
+ bne .L463
+.L467:
+ ldr r1, [r4, #4]
+ ldr r2, [sp, #12]
+ ldr r0, .L495+16
+ bl printf
+ ldr r1, [r4, #8]
+ cbz r1, .L469
+ movs r3, #4
+ ldr r0, .L495+20
+ mov r2, r3
+ bl rknand_print_hex
+.L469:
+ ldr r1, [r4, #12]
+ cbz r1, .L463
+ movs r3, #4
+ ldr r0, .L495+24
+ mov r2, r3
+ bl rknand_print_hex
+.L463:
ldr r3, [r8]
cmp r5, r3
- bne .L459
+ bne .L460
ldr r0, [r4, #8]
cmp r5, r0
- beq .L459
- ldr r3, .L482+16
+ beq .L460
+ ldr r3, .L495+28
mov r1, r5
ldrh r2, [r3]
lsls r2, r2, #9
bl ftl_memcpy
- b .L459
-.L483:
+ b .L460
+.L496:
.align 2
-.L482:
+.L495:
.word .LANCHOR0
.word .LANCHOR137
.word .LC1
.word .LANCHOR78
+ .word .LC11
+ .word .LC12
+ .word .LC13
.word .LANCHOR12
.word .LANCHOR111
.size FlashReadPages, .-FlashReadPages
@@ -4072,36 +4089,36 @@ FlashReadPages:
FtlLoadFactoryBbt:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L494
+ ldr r3, .L507
push {r4, r5, r6, r7, r8, r10, fp, lr}
movs r6, #0
- ldr r5, .L494+4
+ ldr r5, .L507+4
ldr r3, [r3]
- ldr r7, .L494+8
- ldr r10, .L494+20
+ ldr r7, .L507+8
+ ldr r10, .L507+20
str r3, [r5, #8]
- ldr r3, .L494+12
+ ldr r3, .L507+12
ldr r8, [r3]
str r8, [r5, #12]
-.L485:
- ldr r3, .L494+16
+.L498:
+ ldr r3, .L507+16
ldrh r3, [r3]
cmp r6, r3
- bcc .L490
+ bcc .L503
movs r0, #0
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L490:
+.L503:
ldrh r4, [r10]
movw r3, #65535
- ldr fp, .L494+4
+ ldr fp, .L507+4
strh r3, [r7, #2]! @ movhi
subs r4, r4, #1
uxth r4, r4
-.L486:
+.L499:
ldrh r3, [r10]
sub r2, r3, #15
cmp r2, r4
- bgt .L488
+ bgt .L501
mla r3, r6, r3, r4
movs r2, #1
mov r1, r2
@@ -4111,22 +4128,22 @@ FtlLoadFactoryBbt:
bl FlashReadPages
ldr r3, [r5]
adds r3, r3, #1
- beq .L487
+ beq .L500
ldrh r2, [r8]
movw r3, #61664
cmp r2, r3
- bne .L487
+ bne .L500
strh r4, [r7] @ movhi
-.L488:
+.L501:
adds r6, r6, #1
- b .L485
-.L487:
+ b .L498
+.L500:
subs r4, r4, #1
uxth r4, r4
- b .L486
-.L495:
+ b .L499
+.L508:
.align 2
-.L494:
+.L507:
.word .LANCHOR106
.word .LANCHOR138
.word .LANCHOR37+10
@@ -4148,17 +4165,17 @@ FtlGetLastWrittenPage:
cmp r1, #1
push {r4, r5, r6, r7, r8, lr}
it eq
- ldreq r3, .L508
+ ldreq r3, .L521
sub sp, sp, #88
lsl r7, r0, #10
mov r2, r1
it ne
- ldrne r3, .L508+4
+ ldrne r3, .L521+4
mov r6, r1
add r0, sp, #4
movs r1, #1
ldrh r5, [r3]
- ldr r3, .L508+8
+ ldr r3, .L521+8
subs r5, r5, #1
ldr r3, [r3]
sxth r5, r5
@@ -4170,17 +4187,17 @@ FtlGetLastWrittenPage:
bl FlashReadPages
ldr r3, [sp, #24]
adds r3, r3, #1
- bne .L499
+ bne .L512
mov r8, #0
-.L500:
+.L513:
cmp r8, r5
- ble .L503
-.L499:
+ ble .L516
+.L512:
mov r0, r5
add sp, sp, #88
@ sp needed
pop {r4, r5, r6, r7, r8, pc}
-.L503:
+.L516:
add r3, r8, r5
mov r2, r6
add r3, r3, r3, lsr #31
@@ -4193,23 +4210,23 @@ FtlGetLastWrittenPage:
bl FlashReadPages
ldr r3, [sp, #24]
adds r3, r3, #1
- bne .L501
+ bne .L514
ldr r3, [sp, #28]
adds r3, r3, #1
- bne .L501
+ bne .L514
ldr r3, [sp, #4]
adds r3, r3, #1
- beq .L501
+ beq .L514
subs r4, r4, #1
sxth r5, r4
- b .L500
-.L501:
+ b .L513
+.L514:
adds r4, r4, #1
sxth r8, r4
- b .L500
-.L509:
+ b .L513
+.L522:
.align 2
-.L508:
+.L521:
.word .LANCHOR20
.word .LANCHOR19
.word .LANCHOR112
@@ -4227,69 +4244,69 @@ FtlScanSysBlk:
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, r5, r6, r7, r8, r10, fp, lr}
movs r4, #0
- ldr r5, .L591
+ ldr r5, .L604
sub sp, sp, #32
mov r1, r4
- ldr r3, .L591+4
+ ldr r3, .L604+4
ldr r2, [r5]
- ldr r6, .L591+8
+ ldr r6, .L604+8
strh r4, [r3] @ movhi
- ldr r3, .L591+12
+ ldr r3, .L604+12
lsls r2, r2, #2
strh r4, [r6] @ movhi
- ldr r7, .L591+16
+ ldr r7, .L604+16
ldr r0, [r3]
bl ftl_memset
ldr r2, [r5]
mov r1, r4
- ldr r3, .L591+20
+ ldr r3, .L604+20
lsls r2, r2, #1
ldr r0, [r3]
bl ftl_memset
ldrh r2, [r7]
mov r1, r4
- ldr r3, .L591+24
+ ldr r3, .L604+24
lsls r2, r2, #2
ldr r0, [r3]
bl ftl_memset
ldrh r2, [r7]
mov r1, r4
- ldr r3, .L591+28
+ ldr r3, .L604+28
lsls r2, r2, #1
ldr r0, [r3]
bl ftl_memset
movs r2, #16
movs r1, #255
- ldr r0, .L591+32
+ ldr r0, .L604+32
bl ftl_memset
- ldr r3, .L591+36
+ ldr r3, .L604+36
str r6, [sp, #12]
str r5, [sp, #16]
ldrh r3, [r3]
str r3, [sp, #4]
-.L511:
- ldr r3, .L591+40
+.L524:
+ ldr r3, .L604+40
ldr r2, [sp, #4]
ldrh r3, [r3]
cmp r3, r2
- bls .L552
- ldr r3, .L591+44
+ bls .L565
+ ldr r3, .L604+44
movs r5, #0
- ldr r1, .L591+48
+ ldr r1, .L604+48
mov fp, r5
movs r7, #20
ldrh r8, [r3]
- ldr r3, .L591+52
+ ldr r3, .L604+52
ldr r2, [r1]
- ldr r1, .L591+56
+ ldr r1, .L604+56
ldr r6, [r3]
- ldr r3, .L591+60
+ ldr r3, .L604+60
str r2, [sp, #8]
ldrh r10, [r1]
ldr r3, [r3]
- ldr r2, .L591+64
- b .L553
-.L513:
+ ldr r2, .L604+64
+ b .L566
+.L526:
ldrb r0, [r2, r5] @ zero_extendqisi2
ldr r1, [sp, #4]
str r3, [sp, #28]
@@ -4299,7 +4316,7 @@ FtlScanSysBlk:
bl FtlBbmIsBadBlock
ldr r2, [sp, #24]
ldr r3, [sp, #28]
- cbnz r0, .L512
+ cbnz r0, .L525
ldr r1, [sp, #20]
mla r0, r7, fp, r6
ldr r4, [sp, #8]
@@ -4312,31 +4329,31 @@ FtlScanSysBlk:
str r1, [r0, #12]
add r1, fp, #1
uxth fp, r1
-.L512:
+.L525:
adds r5, r5, #1
-.L553:
+.L566:
uxth r1, r5
cmp r8, r1
- bhi .L513
+ bhi .L526
cmp fp, #0
- bne .L514
-.L551:
+ bne .L527
+.L564:
ldr r3, [sp, #4]
adds r3, r3, #1
uxth r3, r3
str r3, [sp, #4]
- b .L511
-.L514:
+ b .L524
+.L527:
movs r7, #0
movs r2, #1
mov r1, fp
mov r0, r6
bl FlashReadPages
-.L515:
+.L528:
uxth r3, r7
cmp fp, r3
- bls .L551
- ldr r3, .L591+52
+ bls .L564
+ ldr r3, .L604+52
mov r8, #20
mul r8, r8, r7
ldr r3, [r3]
@@ -4346,10 +4363,10 @@ FtlScanSysBlk:
ldr r6, [r2, #12]
adds r3, r3, #1
ubfx r5, r5, #10, #16
- bne .L518
+ bne .L531
mov r10, #16
-.L520:
- ldr r3, .L591+52
+.L533:
+ ldr r3, .L604+52
movs r2, #1
mov r1, r2
ldr r0, [r3]
@@ -4361,83 +4378,83 @@ FtlScanSysBlk:
ldrh r2, [r6]
movw r3, #65535
cmp r2, r3
- ldr r3, .L591+52
+ ldr r3, .L604+52
ldr r3, [r3]
- bne .L517
+ bne .L530
mov r2, #-1
str r2, [r3, r8]
- ldr r3, .L591+52
+ ldr r3, .L604+52
ldr r3, [r3]
ldr r3, [r3, r8]
cmp r3, r2
- bne .L518
-.L519:
+ bne .L531
+.L532:
movs r1, #1
- b .L590
-.L517:
+ b .L603
+.L530:
ldr r3, [r3, r8]
adds r3, r3, #1
- bne .L518
+ bne .L531
add r10, r10, #-1
uxth r10, r10
cmp r10, #0
- bne .L520
- b .L519
-.L518:
- ldr r3, .L591+68
+ bne .L533
+ b .L532
+.L531:
+ ldr r3, .L604+68
ldr r2, [r3]
ldr r3, [r6, #4]
adds r1, r2, #1
- beq .L521
+ beq .L534
cmp r2, r3
- bhi .L522
-.L521:
+ bhi .L535
+.L534:
adds r2, r3, #1
ittt ne
- ldrne r1, .L591+68
+ ldrne r1, .L604+68
addne r2, r3, #1
strne r2, [r1]
-.L522:
+.L535:
ldrh r2, [r6]
movw r1, #61604
cmp r2, r1
- beq .L524
- bhi .L525
+ beq .L537
+ bhi .L538
movw r3, #61574
cmp r2, r3
- beq .L526
-.L523:
+ beq .L539
+.L536:
adds r7, r7, #1
- b .L515
-.L525:
+ b .L528
+.L538:
movw r3, #61634
cmp r2, r3
- beq .L527
+ beq .L540
movw r3, #65535
cmp r2, r3
- bne .L523
+ bne .L536
movs r1, #0
-.L590:
+.L603:
mov r0, r5
bl FtlFreeSysBlkQueueIn
- b .L523
-.L527:
- ldr r3, .L591+8
+ b .L536
+.L540:
+ ldr r3, .L604+8
ldrh r2, [r3]
- ldr r3, .L591
+ ldr r3, .L604
ldr r3, [r3]
cmp r2, r3
- bls .L529
+ bls .L542
movw r2, #1225
- ldr r1, .L591+72
- ldr r0, .L591+76
+ ldr r1, .L604+72
+ ldr r0, .L604+76
bl printf
-.L529:
+.L542:
ldr r3, [sp, #16]
ldr r2, [sp, #12]
ldr r1, [r3]
ldrh r0, [r2]
- ldr r2, .L591+12
+ ldr r2, .L604+12
uxth r10, r1
ldr ip, [r2]
add r3, r10, #-1
@@ -4445,61 +4462,61 @@ FtlScanSysBlk:
add r10, r10, #-1
sxth r3, r3
sxth r10, r10
-.L530:
+.L543:
cmp r3, r10
- bgt .L536
+ bgt .L549
cmp r3, #0
- bge .L568
- b .L523
-.L536:
+ bge .L581
+ b .L536
+.L549:
ldr r2, [ip, r3, lsl #2]
add r8, ip, r3, lsl #2
ldr r4, [r6, #4]
cmp r4, r2
- bls .L531
+ bls .L544
ldr r2, [ip]
- cbnz r2, .L532
+ cbnz r2, .L545
cmp r1, r0
ittt ne
- ldrne r2, .L591+8
+ ldrne r2, .L604+8
addne r0, r0, #1
strhne r0, [r2] @ movhi
-.L532:
- ldr r2, .L591+20
+.L545:
+ ldr r2, .L604+20
uxth r10, r3
ldr r0, [r2]
movs r2, #0
-.L533:
+.L546:
uxth lr, r2
sxth r1, r2
cmp r10, lr
- bhi .L534
+ bhi .L547
ldr r2, [r6, #4]
cmp r3, #0
str r2, [r8]
strh r5, [r0, r3, lsl #1] @ movhi
- blt .L523
- ldr r2, .L591+8
+ blt .L536
+ ldr r2, .L604+8
ldrh r0, [r2]
- ldr r2, .L591
+ ldr r2, .L604
ldr r2, [r2]
subs r2, r2, r0
subs r2, r2, #1
sxth r2, r2
cmp r3, r2
- bgt .L523
-.L568:
- ldr r2, .L591+8
+ bgt .L536
+.L581:
+ ldr r2, .L604+8
adds r0, r0, #1
strh r0, [r2] @ movhi
ldr r2, [r6, #4]
str r2, [ip, r3, lsl #2]
- ldr r2, .L591+20
-.L588:
+ ldr r2, .L604+20
+.L601:
ldr r2, [r2]
strh r5, [r2, r3, lsl #1] @ movhi
- b .L523
-.L534:
+ b .L536
+.L547:
add lr, ip, r1, lsl #2
adds r2, r2, #1
ldr r4, [lr, #4]
@@ -4507,14 +4524,14 @@ FtlScanSysBlk:
ldrh lr, [lr, #2]
str r4, [ip, r1, lsl #2]
strh lr, [r0, r1, lsl #1] @ movhi
- b .L533
-.L531:
+ b .L546
+.L544:
subs r3, r3, #1
sxth r3, r3
- b .L530
-.L592:
+ b .L543
+.L605:
.align 2
-.L591:
+.L604:
.word .LANCHOR30
.word .LANCHOR35
.word .LANCHOR130
@@ -4535,72 +4552,72 @@ FtlScanSysBlk:
.word .LANCHOR82
.word .LANCHOR140
.word .LC1
-.L526:
- ldr r8, .L593+12
- ldr r10, .L593+20
+.L539:
+ ldr r8, .L606+12
+ ldr r10, .L606+20
ldrh r2, [r8]
ldrh r3, [r10]
cmp r2, r3
- bls .L539
+ bls .L552
movw r2, #1266
- ldr r1, .L593
- ldr r0, .L593+4
+ ldr r1, .L606
+ ldr r0, .L606+4
bl printf
-.L539:
- ldr r2, .L593+8
+.L552:
+ ldr r2, .L606+8
ldrh lr, [r10]
ldrh ip, [r8]
ldr r0, [r2]
add r10, lr, #-1
sxth r3, r10
sub r10, r10, ip
-.L540:
+.L553:
cmp r3, r10
- ble .L545
+ ble .L558
ldr r1, [r6, #4]
add r8, r0, r3, lsl #2
ldr r2, [r0, r3, lsl #2]
cmp r1, r2
- bls .L541
+ bls .L554
ldr r2, [r0]
- cbnz r2, .L542
+ cbnz r2, .L555
cmp lr, ip
ittt ne
- ldrne r2, .L593+12
+ ldrne r2, .L606+12
addne ip, ip, #1
strhne ip, [r2] @ movhi
-.L542:
- ldr r2, .L593+16
+.L555:
+ ldr r2, .L606+16
uxth r10, r3
ldr ip, [r2]
movs r2, #0
-.L543:
+.L556:
uxth lr, r2
sxth r1, r2
cmp r10, lr
- bhi .L544
+ bhi .L557
ldr r2, [r6, #4]
str r2, [r8]
strh r5, [ip, r3, lsl #1] @ movhi
-.L545:
+.L558:
cmp r3, #0
- blt .L523
- ldr r2, .L593+20
- ldr ip, .L593+12
+ blt .L536
+ ldr r2, .L606+20
+ ldr ip, .L606+12
ldrh r2, [r2]
ldrh r1, [ip]
subs r2, r2, #1
subs r2, r2, r1
sxth r2, r2
cmp r3, r2
- bgt .L523
+ bgt .L536
ldr r2, [r6, #4]
adds r1, r1, #1
strh r1, [ip] @ movhi
str r2, [r0, r3, lsl #2]
- ldr r2, .L593+16
- b .L588
-.L544:
+ ldr r2, .L606+16
+ b .L601
+.L557:
add lr, r0, r1, lsl #2
adds r2, r2, #1
ldr r4, [lr, #4]
@@ -4608,88 +4625,88 @@ FtlScanSysBlk:
ldrh lr, [lr, #2]
str r4, [r0, r1, lsl #2]
strh lr, [ip, r1, lsl #1] @ movhi
- b .L543
-.L541:
+ b .L556
+.L554:
subs r3, r3, #1
sxth r3, r3
- b .L540
-.L524:
- ldr r8, .L593+40
+ b .L553
+.L537:
+ ldr r8, .L606+40
movw r2, #65535
ldrh r1, [r8]
cmp r1, r2
- bne .L547
-.L589:
+ bne .L560
+.L602:
strh r5, [r8] @ movhi
str r3, [r8, #8]
- b .L523
-.L547:
+ b .L536
+.L560:
ldrh r0, [r8, #4]
cmp r0, r2
- beq .L548
+ beq .L561
movs r1, #1
bl FtlFreeSysBlkQueueIn
-.L548:
+.L561:
ldr r3, [r6, #4]
ldr r2, [r8, #8]
cmp r2, r3
- bcs .L549
+ bcs .L562
ldrh r2, [r8]
strh r2, [r8, #4] @ movhi
- b .L589
-.L549:
+ b .L602
+.L562:
strh r5, [r8, #4] @ movhi
- b .L523
-.L552:
- ldr r3, .L593+24
+ b .L536
+.L565:
+ ldr r3, .L606+24
ldr r2, [r3]
ldrh r3, [r2]
- cbz r3, .L554
-.L557:
- ldr r3, .L593+16
+ cbz r3, .L567
+.L570:
+ ldr r3, .L606+16
ldr r4, [r3]
ldrh r2, [r4]
cmp r2, #0
- beq .L555
-.L556:
- ldr r3, .L593+28
+ beq .L568
+.L569:
+ ldr r3, .L606+28
ldrh r2, [r3]
- ldr r3, .L593+32
+ ldr r3, .L606+32
ldr r3, [r3]
cmp r2, r3
- bls .L587
+ bls .L600
movw r2, #1391
- ldr r1, .L593
- ldr r0, .L593+4
+ ldr r1, .L606
+ ldr r0, .L606+4
bl printf
-.L587:
+.L600:
movs r0, #0
add sp, sp, #32
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L554:
- ldr r1, .L593+28
+.L567:
+ ldr r1, .L606+28
ldrh r1, [r1]
cmp r1, #0
- beq .L557
- ldr r5, .L593+32
+ beq .L570
+ ldr r5, .L606+32
ldr r0, [r5]
-.L558:
+.L571:
sxth r1, r3
cmp r1, r0
- bcs .L557
+ bcs .L570
ldrh r4, [r2, r1, lsl #1]
adds r3, r3, #1
cmp r4, #0
- beq .L558
- ldr r3, .L593+36
+ beq .L571
+ ldr r3, .L606+36
movs r6, #0
ldr r0, [r3]
mov r3, r1
-.L559:
+.L572:
ldr r4, [r5]
cmp r3, r4
- bcs .L557
+ bcs .L570
ldrh r7, [r2, r3, lsl #1]
subs r4, r3, r1
strh r7, [r2, r4, lsl #1] @ movhi
@@ -4698,30 +4715,30 @@ FtlScanSysBlk:
strh r6, [r2, r3, lsl #1] @ movhi
adds r3, r3, #1
sxth r3, r3
- b .L559
-.L555:
- ldr r3, .L593+12
+ b .L572
+.L568:
+ ldr r3, .L606+12
ldrh r3, [r3]
cmp r3, #0
- beq .L556
- ldr r5, .L593+20
+ beq .L569
+ ldr r5, .L606+20
ldrh r1, [r5]
-.L564:
+.L577:
sxth r3, r2
cmp r3, r1
mov r6, r3
- bge .L556
+ bge .L569
ldrh r0, [r4, r3, lsl #1]
adds r2, r2, #1
cmp r0, #0
- beq .L564
- ldr r2, .L593+8
+ beq .L577
+ ldr r2, .L606+8
movs r0, #0
ldr r2, [r2]
-.L565:
+.L578:
ldrh r1, [r5]
cmp r3, r1
- bge .L556
+ bge .L569
ldrh r7, [r4, r3, lsl #1]
subs r1, r3, r6
strh r7, [r4, r1, lsl #1] @ movhi
@@ -4730,10 +4747,10 @@ FtlScanSysBlk:
adds r1, r3, #1
strh r0, [r4, r3, lsl #1] @ movhi
sxth r3, r1
- b .L565
-.L594:
+ b .L578
+.L607:
.align 2
-.L593:
+.L606:
.word .LANCHOR140
.word .LC1
.word .LANCHOR122
@@ -4758,24 +4775,24 @@ FtlLoadBbt:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, r6, r7, r8, r10, lr}
- ldr r8, .L624+40
- ldr r4, .L624
+ ldr r8, .L637+40
+ ldr r4, .L637
ldr r3, [r8]
- ldr r7, .L624+4
+ ldr r7, .L637+4
mov r10, r4
str r3, [r4, #8]
- ldr r3, .L624+8
+ ldr r3, .L637+8
ldr r6, [r3]
str r6, [r4, #12]
bl FtlBbtMemInit
ldrh r5, [r7]
subs r5, r5, #1
uxth r5, r5
-.L596:
+.L609:
ldrh r3, [r7]
subs r3, r3, #15
cmp r3, r5
- bgt .L599
+ bgt .L612
lsls r3, r5, #10
movs r2, #1
mov r1, r2
@@ -4784,7 +4801,7 @@ FtlLoadBbt:
bl FlashReadPages
ldr r3, [r4]
adds r3, r3, #1
- bne .L597
+ bne .L610
ldr r3, [r4, #4]
movs r2, #1
mov r1, r2
@@ -4792,101 +4809,101 @@ FtlLoadBbt:
adds r3, r3, #1
str r3, [r4, #4]
bl FlashReadPages
-.L597:
+.L610:
ldr r3, [r4]
adds r3, r3, #1
- beq .L598
+ beq .L611
ldrh r2, [r6]
movw r3, #61649
cmp r2, r3
- bne .L598
- ldr r3, .L624+12
+ bne .L611
+ ldr r3, .L637+12
ldr r2, [r6, #4]
strh r5, [r3] @ movhi
str r2, [r3, #8]
ldrh r2, [r6, #8]
strh r2, [r3, #4] @ movhi
-.L599:
- ldr r5, .L624+12
+.L612:
+ ldr r5, .L637+12
movw r2, #65535
ldrh r3, [r5]
cmp r3, r2
- beq .L613
+ beq .L626
ldrh r3, [r5, #4]
cmp r3, r2
- beq .L603
+ beq .L616
lsls r3, r3, #10
movs r2, #1
mov r1, r2
- ldr r0, .L624
+ ldr r0, .L637
str r3, [r4, #4]
bl FlashReadPages
ldr r3, [r4]
adds r3, r3, #1
- beq .L603
+ beq .L616
ldrh r2, [r6]
movw r3, #61649
cmp r2, r3
- bne .L603
+ bne .L616
ldr r3, [r6, #4]
ldr r2, [r5, #8]
cmp r3, r2
- bls .L603
+ bls .L616
ldrh r2, [r5, #4]
str r3, [r5, #8]
ldrh r3, [r6, #8]
strh r2, [r5] @ movhi
strh r3, [r5, #4] @ movhi
-.L603:
- ldr r10, .L624
+.L616:
+ ldr r10, .L637
movs r1, #1
ldrh r0, [r5]
bl FtlGetLastWrittenPage
sxth r7, r0
adds r0, r0, #1
strh r0, [r5, #2] @ movhi
-.L605:
+.L618:
cmp r7, #0
- bge .L608
- movs r2, #253
- ldr r1, .L624+16
- ldr r0, .L624+20
+ bge .L621
+ movs r2, #251
+ ldr r1, .L637+16
+ ldr r0, .L637+20
bl printf
-.L607:
+.L620:
ldrh r3, [r6, #10]
ldrh r0, [r6, #12]
strh r3, [r5, #6] @ movhi
movw r3, #65535
cmp r0, r3
- beq .L610
- ldr r3, .L624+24
+ beq .L623
+ ldr r3, .L637+24
ldr r2, [r3]
cmp r0, r2
- beq .L610
- ldr r3, .L624+28
+ beq .L623
+ ldr r3, .L637+28
ldrh r3, [r3]
lsrs r3, r3, #2
cmp r2, r3
- bcs .L610
+ bcs .L623
cmp r0, r3
- bcs .L610
+ bcs .L623
bl FtlSysBlkNumInit
-.L610:
- ldr r6, .L624+32
+.L623:
+ ldr r6, .L637+32
movs r5, #0
- ldr r7, .L624+36
- ldr r8, .L624+44
-.L611:
+ ldr r7, .L637+36
+ ldr r8, .L637+44
+.L624:
ldrh r3, [r7]
cmp r5, r3
- bcc .L612
+ bcc .L625
movs r0, #0
pop {r3, r4, r5, r6, r7, r8, r10, pc}
-.L598:
+.L611:
subs r5, r5, #1
uxth r5, r5
- b .L596
-.L608:
+ b .L609
+.L621:
ldrh r3, [r5]
movs r2, #1
mov r1, r2
@@ -4898,16 +4915,16 @@ FtlLoadBbt:
bl FlashReadPages
ldr r3, [r4]
adds r3, r3, #1
- beq .L606
+ beq .L619
ldrh r2, [r6]
movw r3, #61649
cmp r2, r3
- beq .L607
-.L606:
+ beq .L620
+.L619:
subs r7, r7, #1
sxth r7, r7
- b .L605
-.L612:
+ b .L618
+.L625:
ldrh r2, [r8]
ldr r1, [r4, #8]
ldr r0, [r6, #4]!
@@ -4915,13 +4932,13 @@ FtlLoadBbt:
mla r1, r5, r2, r1
adds r5, r5, #1
bl ftl_memcpy
- b .L611
-.L613:
+ b .L624
+.L626:
mov r0, #-1
pop {r3, r4, r5, r6, r7, r8, r10, pc}
-.L625:
+.L638:
.align 2
-.L624:
+.L637:
.word .LANCHOR138
.word .LANCHOR17
.word .LANCHOR114
@@ -4952,26 +4969,26 @@ FlashProgPages:
mov r10, r1
mov r4, r0
mov r5, r0
- ldr r3, .L666
+ ldr r3, .L680
mov r8, #0
- ldr fp, .L666+48
+ ldr fp, .L680+52
str r2, [sp, #8]
ldrh r3, [r3, #12]
str r3, [sp]
lsls r3, r3, #3
str r3, [sp, #4]
-.L627:
+.L640:
cmp r8, r10
- bne .L640
+ bne .L653
ldr r3, [sp, #12]
cmp r3, #0
- beq .L658
- ldr r6, .L666+4
+ beq .L672
+ ldr r6, .L680+4
movs r5, #0
-.L642:
+.L655:
cmp r8, r5
- beq .L658
- ldr r7, .L666+8
+ beq .L672
+ ldr r7, .L680+8
movs r1, #0
ldr r2, [r6]
add r0, sp, #28
@@ -4987,73 +5004,81 @@ FlashProgPages:
bl FlashReadPages
ldr r10, [sp, #28]
cmp r10, #-1
- bne .L643
+ bne .L656
ldr r1, [r4, #4]
- ldr r0, .L666+12
+ ldr r0, .L680+12
bl printf
str r10, [r4]
-.L643:
+.L656:
+ ldr r10, [sp, #28]
+ cmp r10, #256
+ bne .L657
+ ldr r1, [r4, #4]
+ ldr r0, .L680+16
+ bl printf
+ str r10, [r4]
+.L657:
ldr r3, [r4, #12]
- cbz r3, .L644
+ cbz r3, .L658
ldr r2, [r3]
ldr r3, [r7]
ldr r3, [r3]
cmp r2, r3
- beq .L644
+ beq .L658
ldr r1, [r4, #4]
- ldr r0, .L666+16
+ ldr r0, .L680+20
bl printf
mov r3, #-1
str r3, [r4]
-.L644:
+.L658:
ldr r3, [r4, #8]
- cbz r3, .L645
+ cbz r3, .L659
ldr r2, [r3]
ldr r3, [r6]
ldr r3, [r3]
cmp r2, r3
- beq .L645
+ beq .L659
ldr r1, [r4, #4]
- ldr r0, .L666+20
+ ldr r0, .L680+24
bl printf
mov r3, #-1
str r3, [r4]
-.L645:
+.L659:
adds r5, r5, #1
adds r4, r4, #20
- b .L642
-.L640:
+ b .L655
+.L653:
ldr r3, [r5, #8]
- cbz r3, .L628
+ cbz r3, .L641
ldr r3, [r5, #12]
- cbnz r3, .L629
-.L628:
- movs r2, #134
- ldr r1, .L666+24
- ldr r0, .L666+28
+ cbnz r3, .L642
+.L641:
+ movs r2, #142
+ ldr r1, .L680+28
+ ldr r0, .L680+32
bl printf
-.L629:
+.L642:
add r2, sp, #20
add r1, sp, #24
ldr r0, [r5, #4]
bl l2p_addr_tran.isra.0
ldr r6, [sp, #20]
cmp r6, #3
- bls .L630
-.L665:
+ bls .L643
+.L679:
mov r3, #-1
str r3, [r5]
- b .L631
-.L630:
- cbnz r6, .L632
+ b .L644
+.L643:
+ cbnz r6, .L645
ldr r3, [sp, #24]
ldr r2, [sp, #4]
cmp r2, r3
- bls .L632
- ldr r5, .L666+24
- ldr r7, .L666+32
- b .L664
-.L634:
+ bls .L645
+ ldr r5, .L680+28
+ ldr r7, .L680+36
+ b .L678
+.L647:
mov r3, #-1
ldr r2, [r4, #-16]
str r3, [r4, #-20]
@@ -5064,49 +5089,49 @@ FlashProgPages:
movs r3, #16
movs r2, #4
ldr r1, [r4, #-12]
- ldr r0, .L666+36
+ ldr r0, .L680+40
bl rknand_print_hex
movs r3, #4
ldr r1, [r4, #-8]
mov r2, r3
- ldr r0, .L666+40
+ ldr r0, .L680+44
bl rknand_print_hex
-.L664:
+.L678:
cmp r6, r10
add r4, r4, #20
- bne .L634
-.L658:
+ bne .L647
+.L672:
movs r0, #0
add sp, sp, #48
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L632:
+.L645:
ldr r1, [r5, #8]
lsls r3, r1, #26
- beq .L647
- ldr r3, .L666+4
+ beq .L661
+ ldr r3, .L680+4
ldr r6, [r3]
cmp r1, r6
- beq .L635
- ldr r3, .L666+44
+ beq .L648
+ ldr r3, .L680+48
mov r0, r6
ldrh r2, [r3]
lsls r2, r2, #9
bl ftl_memcpy
-.L635:
+.L648:
ldr r3, [r5, #12]
mov r2, r6
ldr r1, [sp, #24]
ldrb r0, [sp, #20] @ zero_extendqisi2
ldr r7, [fp, #8]
blx r7
- cbnz r0, .L636
+ cbnz r0, .L649
str r0, [r5]
-.L637:
- ldr r3, .L666
+.L650:
+ ldr r3, .L680
ldrh r3, [r3, #14]
cmp r3, #4
- bne .L631
+ bne .L644
ldr r0, [sp]
add r2, r6, #2048
ldr r3, [r5, #12]
@@ -5117,27 +5142,28 @@ FlashProgPages:
ldrb r0, [sp, #20] @ zero_extendqisi2
blx r6
cmp r0, #0
- bne .L665
-.L631:
+ bne .L679
+.L644:
add r8, r8, #1
adds r5, r5, #20
- b .L627
-.L647:
+ b .L640
+.L661:
mov r6, r1
- b .L635
-.L636:
+ b .L648
+.L649:
mov r3, #-1
str r3, [r5]
- b .L637
-.L667:
+ b .L650
+.L681:
.align 2
-.L666:
+.L680:
.word .LANCHOR0
.word .LANCHOR111
.word .LANCHOR113
- .word .LC11
- .word .LC12
- .word .LC13
+ .word .LC14
+ .word .LC15
+ .word .LC16
+ .word .LC17
.word .LANCHOR142
.word .LC1
.word .LC6
@@ -5157,133 +5183,133 @@ FlashProgPages:
FtlLowFormatEraseBlock:
@ args = 0, pretend = 0, frame = 32
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L711
+ ldr r3, .L725
push {r4, r5, r6, r7, r8, r10, fp, lr}
sub sp, sp, #32
- ldr r7, .L711+4
+ ldr r7, .L725+4
mov r8, #0
mov r6, r1
mov r5, r8
str r0, [r3]
mov r4, r8
- ldr r3, .L711+8
+ ldr r3, .L725+8
mov fp, #20
ldr r10, [r7]
str r0, [sp, #4]
ldrh r3, [r3]
str r3, [sp, #12]
- ldr r3, .L711+12
+ ldr r3, .L725+12
ldr r3, [r3]
str r3, [sp, #16]
- ldr r3, .L711+16
+ ldr r3, .L725+16
ldr r3, [r3]
str r3, [sp, #20]
- ldr r3, .L711+20
+ ldr r3, .L725+20
ldrh r3, [r3]
str r3, [sp, #24]
-.L669:
+.L683:
ldr r3, [sp, #12]
uxth r2, r8
cmp r3, r2
- bhi .L673
+ bhi .L687
cmp r5, #0
- beq .L668
+ beq .L682
mov r0, r10
mov r8, #0
mov r10, #20
mov r2, r5
movs r1, #0
bl FlashEraseBlocks
-.L676:
+.L690:
uxth r3, r8
cmp r5, r3
- bhi .L678
+ bhi .L692
cmp r6, #0
- beq .L694
- ldr r3, .L711+24
+ beq .L708
+ ldr r3, .L725+24
mov r10, #1
ldrh r3, [r3]
str r3, [sp, #8]
-.L679:
+.L693:
movs r7, #0
-.L688:
- ldr r3, .L711+8
+.L702:
+ ldr r3, .L725+8
mov r8, #0
mov r5, r8
ldrh r3, [r3]
str r3, [sp, #16]
- ldr r3, .L711+4
+ ldr r3, .L725+4
ldr fp, [r3]
- ldr r3, .L711+28
+ ldr r3, .L725+28
ldr r3, [r3]
str r3, [sp, #20]
- ldr r3, .L711+12
+ ldr r3, .L725+12
ldr r3, [r3]
str r3, [sp, #24]
- ldr r3, .L711+20
+ ldr r3, .L725+20
ldrh r3, [r3]
str r3, [sp, #28]
-.L680:
+.L694:
ldr r3, [sp, #16]
uxth r2, r8
cmp r3, r2
- bhi .L683
- cbz r5, .L668
+ bhi .L697
+ cbz r5, .L682
mov r0, fp
- ldr fp, .L711+4
+ ldr fp, .L725+4
movs r3, #1
mov r2, r10
mov r1, r5
mov r8, #0
bl FlashProgPages
movs r3, #20
-.L685:
+.L699:
uxth r2, r8
cmp r5, r2
- bhi .L687
+ bhi .L701
adds r7, r7, #1
ldr r2, [sp, #8]
uxth r3, r7
cmp r2, r3
- bhi .L688
- ldr r8, .L711+4
+ bhi .L702
+ ldr r8, .L725+4
movs r7, #0
mov fp, #20
-.L689:
+.L703:
uxth r3, r7
cmp r5, r3
- bhi .L691
+ bhi .L705
ldr r3, [sp, #4]
cmp r3, #63
- bls .L692
- cbz r6, .L668
-.L692:
- ldr r3, .L711+4
+ bls .L706
+ cbz r6, .L682
+.L706:
+ ldr r3, .L725+4
mov r2, r5
mov r1, r10
ldr r0, [r3]
bl FlashEraseBlocks
-.L668:
+.L682:
mov r0, r4
add sp, sp, #32
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L673:
+.L687:
mul r2, fp, r8
movs r3, #0
ldr r1, [sp, #4]
str r3, [r10, r2]
- ldr r3, .L711+32
+ ldr r3, .L725+32
ldrb r0, [r3, r8] @ zero_extendqisi2
bl V2P_block
str r0, [sp, #8]
- cbz r6, .L670
+ cbz r6, .L684
bl IsBlkInVendorPart
- cbnz r0, .L671
-.L670:
+ cbnz r0, .L685
+.L684:
ldr r0, [sp, #8]
bl FtlBbmIsBadBlock
- cbnz r0, .L672
+ cbnz r0, .L686
ldr r3, [sp, #8]
mla r1, fp, r5, r10
lsls r2, r3, #10
@@ -5298,50 +5324,50 @@ FtlLowFormatEraseBlock:
bic r2, r2, #3
add r2, r2, r3
str r2, [r1, #12]
-.L671:
+.L685:
add r8, r8, #1
- b .L669
-.L672:
+ b .L683
+.L686:
adds r4, r4, #1
uxth r4, r4
- b .L671
-.L678:
+ b .L685
+.L692:
mul r3, r10, r8
ldr r2, [r7]
adds r1, r2, r3
ldr r3, [r2, r3]
adds r3, r3, #1
- bne .L677
+ bne .L691
ldr r0, [r1, #4]
adds r4, r4, #1
uxth r4, r4
ubfx r0, r0, #10, #16
bl FtlBbmMapBadBlock
-.L677:
+.L691:
add r8, r8, #1
- b .L676
-.L694:
+ b .L690
+.L708:
movs r3, #2
mov r10, r6
str r3, [sp, #8]
- b .L679
-.L683:
+ b .L693
+.L697:
movs r3, #20
ldr r1, [sp, #4]
mul r2, r3, r8
movs r3, #0
str r3, [fp, r2]
- ldr r3, .L711+32
+ ldr r3, .L725+32
ldrb r0, [r3, r8] @ zero_extendqisi2
bl V2P_block
str r0, [sp, #12]
- cbz r6, .L681
+ cbz r6, .L695
bl IsBlkInVendorPart
- cbnz r0, .L682
-.L681:
+ cbnz r0, .L696
+.L695:
ldr r0, [sp, #12]
bl FtlBbmIsBadBlock
- cbnz r0, .L682
+ cbnz r0, .L696
movs r3, #20
mla r1, r3, r5, fp
ldr r3, [sp, #12]
@@ -5357,15 +5383,15 @@ FtlLowFormatEraseBlock:
bic r2, r2, #3
add r2, r2, r3
str r2, [r1, #12]
-.L682:
+.L696:
add r8, r8, #1
- b .L680
-.L687:
+ b .L694
+.L701:
mul r2, r3, r8
ldr r1, [fp]
adds r0, r1, r2
ldr r2, [r1, r2]
- cbz r2, .L686
+ cbz r2, .L700
ldr r0, [r0, #4]
adds r4, r4, #1
str r3, [sp, #12]
@@ -5373,26 +5399,26 @@ FtlLowFormatEraseBlock:
ubfx r0, r0, #10, #16
bl FtlBbmMapBadBlock
ldr r3, [sp, #12]
-.L686:
+.L700:
add r8, r8, #1
- b .L685
-.L691:
- cbz r6, .L690
+ b .L699
+.L705:
+ cbz r6, .L704
mul r3, fp, r7
ldr r2, [r8]
adds r1, r2, r3
ldr r3, [r2, r3]
- cbnz r3, .L690
+ cbnz r3, .L704
ldr r0, [r1, #4]
movs r1, #1
ubfx r0, r0, #10, #16
bl FtlFreeSysBlkQueueIn
-.L690:
+.L704:
adds r7, r7, #1
- b .L689
-.L712:
+ b .L703
+.L726:
.align 2
-.L711:
+.L725:
.word .LANCHOR99
.word .LANCHOR79
.word .LANCHOR3
@@ -5418,8 +5444,8 @@ FlashTestBlk:
push {r4, r5, lr}
mov r5, r0
sub sp, sp, #92
- bls .L716
- ldr r4, .L718
+ bls .L730
+ ldr r4, .L732
add r0, sp, #24
movs r2, #32
movs r1, #165
@@ -5443,7 +5469,7 @@ FlashTestBlk:
mov r1, r3
bl FlashProgPages
ldr r3, [sp, #4]
- cbnz r3, .L717
+ cbnz r3, .L731
adds r3, r5, #1
add r0, sp, #4
str r3, [sp, #8]
@@ -5456,26 +5482,26 @@ FlashTestBlk:
it ne
movne r4, #1
negs r4, r4
-.L715:
+.L729:
movs r2, #1
movs r1, #0
add r0, sp, #4
str r5, [sp, #8]
bl FlashEraseBlocks
-.L713:
+.L727:
mov r0, r4
add sp, sp, #92
@ sp needed
pop {r4, r5, pc}
-.L717:
+.L731:
mov r4, #-1
- b .L715
-.L716:
+ b .L729
+.L730:
movs r4, #0
- b .L713
-.L719:
+ b .L727
+.L733:
.align 2
-.L718:
+.L732:
.word .LANCHOR112
.size FlashTestBlk, .-FlashTestBlk
.section .text.FtlBbmTblFlush,"ax",%progbits
@@ -5490,38 +5516,38 @@ FtlBbmTblFlush:
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r10, fp, lr}
- movs r4, #0
- ldr r7, .L729
movs r1, #0
- ldr r5, .L729+4
+ ldr r7, .L748
+ movs r4, #0
+ ldr r5, .L748+4
ldr r3, [r7]
- mov fp, r7
- ldr r8, .L729+48
- ldr r6, .L729+8
+ ldr fp, .L748+52
+ ldr r6, .L748+8
str r3, [r5, #12]
- ldr r7, .L729+12
- ldr r3, .L729+16
- ldr r10, .L729+52
- ldr r0, [r8]
+ ldr r3, .L748+12
+ ldr r0, [fp]
+ ldr r8, .L748+56
ldrh r2, [r3]
str r0, [r5, #8]
bl ftl_memset
-.L721:
+ str r7, [sp, #12]
+ ldr r7, .L748+16
+.L735:
ldrh r3, [r7]
cmp r4, r3
- blt .L722
+ blt .L736
ldr r6, [r5, #12]
movs r2, #16
- ldr r4, .L729+20
+ ldr r4, .L748+20
movs r1, #255
movs r7, #0
mov r0, r6
+ mov r8, r7
bl ftl_memset
movw r3, #61649
mov r10, r4
strh r3, [r6] @ movhi
ldr r3, [r4, #8]
- str r7, [sp, #12]
str r3, [r6, #4]
ldrh r3, [r4]
strh r3, [r6, #2] @ movhi
@@ -5529,16 +5555,20 @@ FtlBbmTblFlush:
strh r3, [r6, #8] @ movhi
ldrh r3, [r4, #6]
strh r3, [r6, #10] @ movhi
- ldr r3, .L729+24
+ ldr r3, .L748+24
ldr r3, [r3]
strh r3, [r6, #12] @ movhi
-.L723:
- ldr r3, [r8]
+ ldr r3, .L748+28
+ ldr r3, [r3]
+ strh r3, [r6, #14] @ movhi
+.L737:
+ ldr r3, [fp]
ldrh r2, [r4, #2]
ldrh r1, [r4]
str r3, [r5, #8]
- ldr r3, [fp]
+ ldr r3, [sp, #12]
ldrh r0, [r6, #10]
+ ldr r3, [r3]
str r3, [r5, #12]
movs r3, #0
str r3, [r5]
@@ -5546,14 +5576,14 @@ FtlBbmTblFlush:
str r3, [r5, #4]
ldrh r3, [r4, #4]
str r0, [sp]
- ldr r0, .L729+28
+ ldr r0, .L748+32
bl printf
- ldr r3, .L729+32
+ ldr r3, .L748+36
ldrh r2, [r4, #2]
ldrh r3, [r3]
subs r3, r3, #1
cmp r2, r3
- blt .L724
+ blt .L738
ldr r3, [r4, #8]
mov r1, #0 @ movhi
ldrh r2, [r4]
@@ -5564,7 +5594,7 @@ FtlBbmTblFlush:
strh r2, [r6, #8] @ movhi
ldrh r3, [r4, #4]
strh r2, [r4, #4] @ movhi
- ldr r2, .L729+36
+ ldr r2, .L748+40
strh r3, [r4] @ movhi
lsls r3, r3, #10
ldr r0, [r2]
@@ -5573,9 +5603,9 @@ FtlBbmTblFlush:
mov r1, r2
str r3, [r0, #4]
bl FlashEraseBlocks
-.L724:
+.L738:
movs r3, #1
- ldr r0, .L729+4
+ ldr r0, .L748+4
mov r2, r3
mov r1, r3
bl FlashProgPages
@@ -5583,23 +5613,23 @@ FtlBbmTblFlush:
adds r3, r3, #1
strh r3, [r10, #2] @ movhi
ldr r3, [r5]
- adds r3, r3, #1
- bne .L725
+ adds r2, r3, #1
+ bne .L739
adds r7, r7, #1
ldr r1, [r5, #4]
uxth r7, r7
- ldr r0, .L729+40
+ ldr r0, .L748+44
bl printf
cmp r7, #3
- bls .L723
+ bls .L737
mov r2, r7
ldr r1, [r5, #4]
- ldr r0, .L729+44
+ ldr r0, .L748+48
bl printf
-.L727:
- b .L727
-.L722:
- ldrh r2, [r10]
+.L741:
+ b .L741
+.L736:
+ ldrh r2, [r8]
ldr r3, [r5, #8]
ldr r1, [r6, #4]!
mul r0, r2, r4
@@ -5607,34 +5637,33 @@ FtlBbmTblFlush:
adds r4, r4, #1
add r0, r3, r0, lsl #2
bl ftl_memcpy
- b .L721
-.L728:
- movs r3, #1
- str r3, [sp, #12]
- b .L723
-.L725:
- ldr r3, [sp, #12]
- cmp r3, #0
- beq .L728
+ b .L735
+.L739:
+ add r8, r8, #1
+ cmp r8, #1
+ beq .L737
+ cmp r3, #256
+ beq .L737
movs r0, #0
add sp, sp, #16
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L730:
+.L749:
.align 2
-.L729:
+.L748:
.word .LANCHOR114
.word .LANCHOR138
.word .LANCHOR37+24
- .word .LANCHOR10
.word .LANCHOR23
+ .word .LANCHOR10
.word .LANCHOR37
.word .LANCHOR2
- .word .LC14
+ .word .LANCHOR143
+ .word .LC18
.word .LANCHOR20
.word .LANCHOR79
- .word .LC15
- .word .LC16
+ .word .LC19
+ .word .LC20
.word .LANCHOR106
.word .LANCHOR127
.size FtlBbmTblFlush, .-FtlBbmTblFlush
@@ -5651,26 +5680,26 @@ allocate_data_superblock:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r4, r5, r6, r7, r8, r10, fp, lr}
mov r4, r0
-.L732:
- ldr r3, .L771
- ldr r8, .L771+68
+.L751:
+ ldr r3, .L790
+ ldr r8, .L790+68
ldrh r3, [r3]
- ldr r10, .L771+72
+ ldr r10, .L790+72
ldrh r2, [r8]
add r3, r3, r2
ldrh r2, [r10]
cmp r3, r2
- ble .L733
- movw r2, #2661
- ldr r1, .L771+4
- ldr r0, .L771+8
+ ble .L752
+ mov r2, #2656
+ ldr r1, .L790+4
+ ldr r0, .L790+8
bl printf
-.L733:
- ldr r3, .L771+12
+.L752:
+ ldr r3, .L790+12
cmp r4, r3
- bne .L759
- ldr r3, .L771
- ldr r2, .L771+16
+ bne .L778
+ ldr r3, .L790
+ ldr r2, .L790+16
ldrh r3, [r3]
ldr r2, [r2]
lsrs r1, r3, #1
@@ -5678,118 +5707,118 @@ allocate_data_superblock:
adds r1, r1, #1
add r1, r1, r2, lsr #2
uxth r1, r1
- cbz r1, .L734
+ cbz r1, .L753
subs r1, r1, #1
uxth r1, r1
-.L734:
- ldr r0, .L771+20
+.L753:
+ ldr r0, .L790+20
bl List_pop_index_node
- ldr r3, .L771
+ ldr r3, .L790
mov r5, r0
uxth r7, r0
ldrh r3, [r3]
- cbnz r3, .L735
- movw r2, #2670
- ldr r1, .L771+4
- ldr r0, .L771+8
+ cbnz r3, .L754
+ movw r2, #2665
+ ldr r1, .L790+4
+ ldr r0, .L790+8
bl printf
-.L735:
- ldr r3, .L771
- ldr r2, .L771
+.L754:
+ ldr r3, .L790
+ ldr r2, .L790
ldrh r3, [r3]
subs r3, r3, #1
strh r3, [r2] @ movhi
ldrh r3, [r10]
cmp r3, r7
- bls .L732
+ bls .L751
uxth r5, r5
lsls r3, r5, #1
str r3, [sp]
- ldr r3, .L771+24
+ ldr r3, .L790+24
ldr r3, [r3]
ldrh r6, [r3, r5, lsl #1]
cmp r6, #0
- bne .L732
+ bne .L751
strh r7, [r4] @ movhi
mov r0, r4
bl make_superblock
ldrb r3, [r4, #7] @ zero_extendqisi2
- cbnz r3, .L737
- ldr r3, .L771+24
+ cbnz r3, .L756
+ ldr r3, .L790+24
movw r2, #65535
mov r0, r7
ldr r3, [r3]
strh r2, [r3, r5, lsl #1] @ movhi
bl INSERT_DATA_LIST
- ldr r3, .L771
+ ldr r3, .L790
ldrh r2, [r8]
ldrh r3, [r3]
add r3, r3, r2
ldrh r2, [r10]
cmp r3, r2
- ble .L732
- movw r2, #2684
- ldr r1, .L771+4
- ldr r0, .L771+8
+ ble .L751
+ movw r2, #2679
+ ldr r1, .L790+4
+ ldr r0, .L790+8
bl printf
- b .L732
-.L759:
+ b .L751
+.L778:
movs r1, #0
- b .L734
-.L737:
- ldr r3, .L771
+ b .L753
+.L756:
+ ldr r3, .L790
ldrh r2, [r8]
ldrh r3, [r3]
add r3, r3, r2
ldrh r2, [r10]
cmp r3, r2
- ble .L739
- movw r2, #2687
- ldr r1, .L771+4
- ldr r0, .L771+8
+ ble .L758
+ movw r2, #2682
+ ldr r1, .L790+4
+ ldr r0, .L790+8
bl printf
-.L739:
- ldr r3, .L771+28
+.L758:
+ ldr r3, .L790+28
add lr, r4, #16
- ldr r2, .L771+32
+ ldr r2, .L790+32
mov r8, #0
ldr ip, [r3]
ldrh r0, [r2]
movs r2, #20
mov r3, ip
mla r0, r2, r0, ip
-.L740:
+.L759:
cmp r0, r3
- bne .L742
- cbnz r6, .L743
- movw r2, #2698
- ldr r1, .L771+4
- ldr r0, .L771+8
+ bne .L761
+ cbnz r6, .L762
+ movw r2, #2693
+ ldr r1, .L790+4
+ ldr r0, .L790+8
bl printf
-.L743:
- ldr r3, .L771+36
+.L762:
+ ldr r3, .L790+36
ldrh r3, [r3]
cmp r3, r7
- bne .L744
- movw r2, #2700
- ldr r1, .L771+4
- ldr r0, .L771+8
+ bne .L763
+ movw r2, #2695
+ ldr r1, .L790+4
+ ldr r0, .L790+8
bl printf
-.L744:
+.L763:
ldrb r2, [r4, #8] @ zero_extendqisi2
- ldr r3, .L771+40
- ldr fp, .L771+76
- ldr r8, .L771+80
+ ldr r3, .L790+40
+ ldr fp, .L790+76
+ ldr r8, .L790+80
ldr r1, [r3]
cmp r2, #0
- bne .L745
+ bne .L764
ldrh r2, [r1, r5, lsl #1]
cmp r2, #0
- beq .L746
- ldr r0, .L771+44
+ beq .L765
+ ldr r0, .L790+44
ldrh r0, [r0]
add r2, r2, r0
-.L769:
+.L788:
strh r2, [r1, r5, lsl #1] @ movhi
mov r0, r7
ldr r2, [fp]
@@ -5798,83 +5827,83 @@ allocate_data_superblock:
adds r2, r2, #1
str r2, [fp]
bl ftl_set_blk_mode
-.L770:
+.L789:
ldr r3, [sp, #4]
ldr r0, [fp]
ldr r3, [r3]
ldrh r1, [r3, r5, lsl #1]
- ldr r3, .L771+48
+ ldr r3, .L790+48
ldr r2, [r3]
cmp r1, r2
it hi
strhi r1, [r3]
- ldr r3, .L771+44
+ ldr r3, .L790+44
ldrh r1, [r10]
ldrh r2, [r3]
ldr r3, [r8]
mla r0, r0, r2, r3
bl __aeabi_uidiv
- ldr r3, .L771+52
- ldr ip, .L771+84
+ ldr r3, .L790+52
+ ldr ip, .L790+84
str r0, [r3]
- ldr r3, .L771+56
+ ldr r3, .L790+56
ldr r2, [r3]
ldr r3, [r2, #16]
adds r3, r3, #1
str r3, [r2, #16]
movs r2, #20
- ldr r3, .L771+28
+ ldr r3, .L790+28
ldr r0, [r3]
adds r3, r0, #4
mla r2, r2, r6, r0
adds r2, r2, #24
-.L750:
+.L769:
adds r3, r3, #20
cmp r2, r3
- bne .L751
+ bne .L770
mov r2, r6
ldrb r1, [r4, #8] @ zero_extendqisi2
mov r8, #0
bl FlashEraseBlocks
mov r10, r8
movs r3, #20
-.L752:
+.L771:
uxth r2, r8
cmp r6, r2
- bhi .L754
+ bhi .L773
cmp r10, #0
- beq .L755
+ beq .L774
mov r0, r7
bl update_multiplier_value
bl FtlBbmTblFlush
-.L755:
+.L774:
ldrb r2, [r4, #7] @ zero_extendqisi2
cmp r2, #0
- bne .L756
- ldr r3, .L771+24
+ bne .L775
+ ldr r3, .L790+24
movw r2, #65535
ldr r3, [r3]
strh r2, [r3, r5, lsl #1] @ movhi
- b .L732
-.L742:
+ b .L751
+.L761:
ldrh r1, [lr], #2
movw fp, #65535
str r8, [r3, #8]
str r8, [r3, #12]
cmp r1, fp
- beq .L741
+ beq .L760
mla fp, r2, r6, ip
adds r6, r6, #1
lsls r1, r1, #10
uxth r6, r6
str r1, [fp, #4]
-.L741:
+.L760:
adds r3, r3, #20
- b .L740
-.L746:
+ b .L759
+.L765:
movs r2, #2
- b .L769
-.L745:
+ b .L788
+.L764:
ldrh r2, [r1, r5, lsl #1]
mov r0, r7
str r3, [sp, #4]
@@ -5884,20 +5913,20 @@ allocate_data_superblock:
adds r2, r2, #1
str r2, [r8]
bl ftl_set_blk_mode.part.6
- b .L770
-.L751:
+ b .L789
+.L770:
ldr r1, [r3, #-20]
and r1, r1, ip
str r1, [r3, #-20]
- b .L750
-.L754:
- ldr r1, .L771+28
+ b .L769
+.L773:
+ ldr r1, .L790+28
mul r2, r3, r8
ldr r1, [r1]
ldr fp, [r1, r2]
adds r0, r1, r2
cmp fp, #-1
- bne .L753
+ bne .L772
ldr r0, [r0, #4]
add r10, r10, #1
str r3, [sp, #4]
@@ -5909,12 +5938,12 @@ allocate_data_superblock:
ldrb r2, [r4, #7] @ zero_extendqisi2
subs r2, r2, #1
strb r2, [r4, #7]
-.L753:
+.L772:
add r8, r8, #1
- b .L752
-.L756:
- ldr r3, .L771+60
- ldr r1, .L771+64
+ b .L771
+.L775:
+ ldr r3, .L790+60
+ ldr r1, .L790+64
ldrh r3, [r3]
strh r7, [r4] @ movhi
smulbb r3, r3, r2
@@ -5927,45 +5956,45 @@ allocate_data_superblock:
str r2, [r4, #12]
adds r2, r2, #1
str r2, [r1]
- ldr r2, .L771+24
+ ldr r2, .L790+24
ldr r1, [sp]
ldr r2, [r2]
strh r3, [r2, r1] @ movhi
ldrh r3, [r4, #4]
- cbz r3, .L757
+ cbz r3, .L776
ldrb r3, [r4, #7] @ zero_extendqisi2
- cbnz r3, .L758
-.L757:
- movw r2, #2753
- ldr r1, .L771+4
- ldr r0, .L771+8
+ cbnz r3, .L777
+.L776:
+ movw r2, #2748
+ ldr r1, .L790+4
+ ldr r0, .L790+8
bl printf
-.L758:
+.L777:
movs r0, #0
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L772:
+.L791:
.align 2
-.L771:
+.L790:
.word .LANCHOR48
- .word .LANCHOR143
+ .word .LANCHOR144
.word .LC1
.word .LANCHOR53
.word .LANCHOR95
- .word .LANCHOR47
+ .word .LANCHOR46
.word .LANCHOR42
.word .LANCHOR79
.word .LANCHOR3
- .word .LANCHOR144
- .word .LANCHOR43
+ .word .LANCHOR145
+ .word .LANCHOR47
.word .LANCHOR14
.word .LANCHOR92
- .word .LANCHOR145
+ .word .LANCHOR143
.word .LANCHOR118
.word .LANCHOR19
.word .LANCHOR82
- .word .LANCHOR45
+ .word .LANCHOR44
.word .LANCHOR5
.word .LANCHOR90
.word .LANCHOR91
@@ -5984,43 +6013,43 @@ FtlGcFreeBadSuperBlk:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r4, r5, r6, r7, r8, r10, fp, lr}
mov r10, r0
- ldr r4, .L785
+ ldr r4, .L804
ldrh r3, [r4]
- cbz r3, .L774
- ldr r8, .L785+12
+ cbz r3, .L793
+ ldr r8, .L804+12
movs r7, #0
-.L775:
- ldr r3, .L785+4
+.L794:
+ ldr r3, .L804+4
ldrh r2, [r3]
uxth r3, r7
cmp r2, r3
- bhi .L781
+ bhi .L800
bl FtlGcReFreshBadBlk
-.L774:
+.L793:
movs r0, #0
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L781:
- ldr r2, .L785+8
+.L800:
+ ldr r2, .L804+8
uxth r3, r7
mov r1, r10
mov fp, #0
ldrb r0, [r2, r3] @ zero_extendqisi2
bl V2P_block
mov r1, r0
-.L776:
+.L795:
ldrh r3, [r4]
uxth r5, fp
cmp r3, r5
- bhi .L780
+ bhi .L799
adds r7, r7, #1
- b .L775
-.L780:
+ b .L794
+.L799:
uxth r6, fp
ldrh r3, [r8, r6, lsl #1]
cmp r3, r1
- bne .L777
+ bne .L796
mov r0, r1
str r1, [sp, #4]
bl FtlBbmMapBadBlock
@@ -6028,23 +6057,23 @@ FtlGcFreeBadSuperBlk:
ldrh r2, [r4]
add r3, r8, r6, lsl #1
ldr r1, [sp, #4]
-.L778:
+.L797:
cmp r5, r2
- bcc .L779
+ bcc .L798
subs r2, r2, #1
strh r2, [r4] @ movhi
-.L777:
+.L796:
add fp, fp, #1
- b .L776
-.L779:
+ b .L795
+.L798:
ldrh r0, [r3, #2]!
adds r5, r5, #1
uxth r5, r5
strh r0, [r3, #-2] @ movhi
- b .L778
-.L786:
+ b .L797
+.L805:
.align 2
-.L785:
+.L804:
.word .LANCHOR74
.word .LANCHOR3
.word .LANCHOR13
@@ -6063,29 +6092,41 @@ update_vpc_list:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, lr}
mov r4, r0
- ldr r3, .L797
+ ldr r3, .L818
ldr r3, [r3]
ldrh r3, [r3, r0, lsl #1]
cmp r3, #0
- bne .L788
- ldr r2, .L797+4
- ldrh r1, [r2]
- cmp r1, r0
- bne .L789
- movw r3, #65535
- strh r3, [r2] @ movhi
-.L790:
- ldr r5, .L797+8
+ bne .L807
+ ldr r3, .L818+4
+ ldrh r2, [r3]
+ cmp r2, r0
+ itt eq
+ movweq r2, #65535
+ strheq r2, [r3] @ movhi
+ ldr r3, .L818+8
+ ldrh r2, [r3]
+ cmp r2, r0
+ itt eq
+ movweq r2, #65535
+ strheq r2, [r3] @ movhi
+ ldr r3, .L818+12
+ ldrh r2, [r3]
+ cmp r2, r0
+ bne .L810
+ movw r2, #65535
+ strh r2, [r3] @ movhi
+.L811:
+ ldr r5, .L818+16
mov r1, r4
- ldr r0, .L797+12
+ ldr r0, .L818+20
bl List_remove_node
ldrh r3, [r5]
- cbnz r3, .L792
- movw r2, #2823
- ldr r1, .L797+16
- ldr r0, .L797+20
+ cbnz r3, .L813
+ movw r2, #2824
+ ldr r1, .L818+24
+ ldr r0, .L818+28
bl printf
-.L792:
+.L813:
ldrh r3, [r5]
mov r0, r4
subs r3, r3, #1
@@ -6093,47 +6134,48 @@ update_vpc_list:
bl free_data_superblock
mov r0, r4
bl FtlGcFreeBadSuperBlk
- ldr r3, .L797+24
+ ldr r3, .L818+32
ldrh r2, [r5]
ldrh r3, [r3]
add r3, r3, r2
- ldr r2, .L797+28
+ ldr r2, .L818+36
ldrh r2, [r2]
cmp r3, r2
- ble .L796
- movw r2, #2826
- ldr r1, .L797+16
- ldr r0, .L797+20
+ ble .L817
+ movw r2, #2827
+ ldr r1, .L818+24
+ ldr r0, .L818+28
bl printf
-.L796:
- movs r3, #1
- b .L787
-.L789:
- ldr r2, .L797+32
- ldrh r2, [r2]
- cmp r2, r0
- beq .L787
- ldr r2, .L797+36
- ldrh r2, [r2]
- cmp r2, r0
- beq .L787
- ldr r2, .L797+40
- ldrh r2, [r2]
- cmp r2, r0
- bne .L790
-.L787:
- mov r0, r3
+.L817:
+ movs r0, #1
pop {r3, r4, r5, pc}
-.L788:
+.L810:
+ ldr r3, .L818+40
+ ldrh r3, [r3]
+ cmp r3, r0
+ beq .L816
+ ldr r3, .L818+44
+ ldrh r3, [r3]
+ cmp r3, r0
+ beq .L816
+ ldr r3, .L818+48
+ ldrh r3, [r3]
+ cmp r3, r0
+ bne .L811
+.L816:
+ movs r0, #0
+ pop {r3, r4, r5, pc}
+.L807:
bl List_update_data_list
- movs r3, #0
- b .L787
-.L798:
+ b .L816
+.L819:
.align 2
-.L797:
+.L818:
.word .LANCHOR42
- .word .LANCHOR144
- .word .LANCHOR45
+ .word .LANCHOR72
+ .word .LANCHOR73
+ .word .LANCHOR145
+ .word .LANCHOR44
.word .LANCHOR41
.word .LANCHOR146
.word .LC1
@@ -6158,47 +6200,47 @@ decrement_vpc_count:
push {r4, r5, r6, lr}
cmp r0, r3
mov r4, r0
- beq .L800
- ldr r5, .L808
+ beq .L821
+ ldr r5, .L829
ldr r3, [r5]
ldrh r2, [r3, r0, lsl #1]
- cbnz r2, .L801
+ cbnz r2, .L822
mov r1, r0
- ldr r0, .L808+4
+ ldr r0, .L829+4
bl printf
ldr r3, [r5]
ldrh r5, [r3, r4, lsl #1]
- cbz r5, .L802
-.L806:
+ cbz r5, .L823
+.L827:
movs r5, #0
-.L799:
+.L820:
mov r0, r5
pop {r4, r5, r6, pc}
-.L802:
- movw r2, #2841
-.L807:
- ldr r1, .L808+8
- ldr r0, .L808+12
+.L823:
+ movw r2, #2842
+.L828:
+ ldr r1, .L829+8
+ ldr r0, .L829+12
bl printf
- b .L799
-.L801:
+ b .L820
+.L822:
subs r2, r2, #1
strh r2, [r3, r0, lsl #1] @ movhi
-.L800:
- ldr r6, .L808+16
+.L821:
+ ldr r6, .L829+16
movw r3, #65535
ldrh r0, [r6]
cmp r0, r3
- bne .L804
+ bne .L825
strh r4, [r6] @ movhi
- b .L806
-.L804:
+ b .L827
+.L825:
cmp r4, r0
- beq .L806
+ beq .L827
bl update_vpc_list
- ldr r3, .L808+20
+ ldr r3, .L829+20
adds r5, r0, #0
- ldr r2, .L808+24
+ ldr r2, .L829+24
it ne
movne r5, #1
strh r4, [r6] @ movhi
@@ -6206,23 +6248,23 @@ decrement_vpc_count:
ldr r2, [r2]
subs r3, r3, r2
asrs r2, r3, #1
- ldr r3, .L808+28
+ ldr r3, .L829+28
muls r3, r2, r3
- ldr r2, .L808
+ ldr r2, .L829
ldr r2, [r2]
uxth r1, r3
ldrh r2, [r2, r1, lsl #1]
cmp r2, #0
- bne .L799
+ bne .L820
cmp r4, r1
- beq .L799
- movw r2, #2857
- b .L807
-.L809:
+ beq .L820
+ movw r2, #2858
+ b .L828
+.L830:
.align 2
-.L808:
+.L829:
.word .LANCHOR42
- .word .LC17
+ .word .LC21
.word .LANCHOR147
.word .LC1
.word .LANCHOR131
@@ -6244,14 +6286,14 @@ FtlSuperblockPowerLostFix:
push {r4, r5, r6, r7, r8, lr}
mov r3, #-1
sub sp, sp, #24
- ldr r2, .L823
+ ldr r2, .L844
movs r6, #0
mov r4, r0
str r3, [sp, #20]
- ldr r3, .L823+4
+ ldr r3, .L844+4
ldr r5, [r2]
mvn r2, #2
- ldr r8, .L823+16
+ ldr r8, .L844+16
ldr r3, [r3]
str r5, [sp, #16]
str r3, [sp, #12]
@@ -6272,18 +6314,18 @@ FtlSuperblockPowerLostFix:
ite eq
moveq r7, #6
movne r7, #7
-.L816:
+.L837:
ldrh r3, [r4, #4]
- cbnz r3, .L812
-.L813:
- ldr r3, .L823+8
+ cbnz r3, .L833
+.L834:
+ ldr r3, .L844+8
ldrh r1, [r4]
ldrh r0, [r4, #4]
ldr r2, [r3]
ldrh r3, [r2, r1, lsl #1]
subs r3, r3, r0
strh r3, [r2, r1, lsl #1] @ movhi
- ldr r3, .L823+12
+ ldr r3, .L844+12
ldrh r3, [r3]
strh r3, [r4, #2] @ movhi
movs r3, #0
@@ -6292,12 +6334,12 @@ FtlSuperblockPowerLostFix:
add sp, sp, #24
@ sp needed
pop {r4, r5, r6, r7, r8, pc}
-.L812:
+.L833:
mov r0, r4
bl get_new_active_ppa
str r0, [sp, #8]
adds r0, r0, #1
- beq .L813
+ beq .L834
ldr r3, [r8]
movs r1, #1
add r0, sp, #4
@@ -6313,11 +6355,11 @@ FtlSuperblockPowerLostFix:
ldrh r0, [r4]
bl decrement_vpc_count
subs r7, r7, #1
- bne .L816
- b .L813
-.L824:
+ bne .L837
+ b .L834
+.L845:
.align 2
-.L823:
+.L844:
.word .LANCHOR114
.word .LANCHOR106
.word .LANCHOR42
@@ -6337,61 +6379,61 @@ FtlMakeBbt:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r4, r5, r6, r7, r8, r10, fp, lr}
movs r6, #0
- ldr r7, .L844
+ ldr r7, .L865
bl FtlBbtMemInit
sub r8, r7, #18
bl FtlLoadFactoryBbt
-.L826:
- ldr r3, .L844+4
+.L847:
+ ldr r3, .L865+4
ldrh r3, [r3]
cmp r6, r3
- bcc .L832
- ldr r5, .L844+8
+ bcc .L853
+ ldr r5, .L865+8
movs r4, #0
-.L833:
+.L854:
ldrh r3, [r5]
uxth r0, r4
adds r4, r4, #1
cmp r3, r0
- bhi .L834
- ldr r4, .L844+12
+ bhi .L855
+ ldr r4, .L865+12
movw r6, #65535
ldrh r5, [r4, #12]
subs r5, r5, #1
uxth r5, r5
-.L835:
+.L856:
ldrh r3, [r4, #12]
subs r3, r3, #47
cmp r3, r5
- bgt .L839
+ bgt .L860
mov r0, r5
bl FtlBbmIsBadBlock
cmp r0, #1
- beq .L836
+ beq .L857
mov r0, r5
bl FlashTestBlk
cmp r0, #0
- beq .L837
+ beq .L858
mov r0, r5
bl FtlBbmMapBadBlock
-.L836:
+.L857:
subs r5, r5, #1
uxth r5, r5
- b .L835
-.L832:
- ldr r3, .L844+16
- ldr r5, .L844+20
+ b .L856
+.L853:
+ ldr r3, .L865+16
+ ldr r5, .L865+20
ldrh r2, [r8, #2]!
- ldr r4, .L844+24
+ ldr r4, .L865+24
ldr r0, [r3]
movw r3, #65535
ldr r10, [r5]
cmp r2, r3
mov fp, r4
- ldr r3, .L844+28
+ ldr r3, .L865+28
str r0, [r4, #8]
str r10, [r4, #12]
- beq .L827
+ beq .L848
ldrh r5, [r3]
mov r0, r4
str r3, [sp]
@@ -6408,13 +6450,13 @@ FtlMakeBbt:
adds r2, r2, #7
asrs r2, r2, #3
bl ftl_memcpy
-.L828:
+.L849:
uxth r0, r5
adds r6, r6, #1
adds r7, r7, #4
bl FtlBbmMapBadBlock
- b .L826
-.L827:
+ b .L847
+.L848:
mov r1, r6
str r3, [sp]
bl FlashGetBadBlockList
@@ -6426,21 +6468,21 @@ FtlMakeBbt:
ldrh r4, [r3]
subs r4, r4, #1
uxth r4, r4
-.L829:
+.L850:
ldr r3, [sp]
ldrh r0, [r3]
smlabb r0, r0, r6, r4
uxth r0, r0
bl FtlBbmIsBadBlock
cmp r0, #1
- beq .L830
+ beq .L851
ldr r3, [sp, #4]
movs r2, #16
movs r1, #0
strh r4, [r8] @ movhi
ldr r0, [r3]
bl ftl_memset
- ldr r3, .L844+16
+ ldr r3, .L865+16
mov r2, #4096
movs r1, #0
ldr r0, [r3]
@@ -6458,42 +6500,42 @@ FtlMakeBbt:
mla r5, r6, r5, r3
lsls r3, r5, #10
str r3, [fp, #4]
- ldr r3, .L844+32
+ ldr r3, .L865+32
ldrh r2, [r3]
lsls r2, r2, #2
bl ftl_memcpy
movs r2, #1
- ldr r0, .L844+24
+ ldr r0, .L865+24
mov r1, r2
bl FlashEraseBlocks
movs r3, #1
- ldr r0, .L844+24
+ ldr r0, .L865+24
mov r2, r3
mov r1, r3
bl FlashProgPages
ldr r3, [fp]
adds r3, r3, #1
- bne .L828
+ bne .L849
uxth r0, r5
bl FtlBbmMapBadBlock
- b .L829
-.L830:
+ b .L850
+.L851:
subs r4, r4, #1
uxth r4, r4
- b .L829
-.L834:
+ b .L850
+.L855:
bl FtlBbmMapBadBlock
- b .L833
-.L837:
+ b .L854
+.L858:
ldrh r3, [r4]
cmp r3, r6
- bne .L838
+ bne .L859
strh r5, [r4] @ movhi
- b .L836
-.L838:
+ b .L857
+.L859:
strh r5, [r4, #4] @ movhi
-.L839:
- ldr r3, .L844+36
+.L860:
+ ldr r3, .L865+36
movs r5, #0
str r5, [r4, #8]
movs r1, #1
@@ -6525,9 +6567,9 @@ FtlMakeBbt:
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L845:
+.L866:
.align 2
-.L844:
+.L865:
.word .LANCHOR37+28
.word .LANCHOR10
.word .LANCHOR25
@@ -6564,24 +6606,24 @@ ftl_memcmp:
js_hash:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L850
+ ldr r3, .L871
add r1, r1, r0
push {r4, lr}
-.L848:
+.L869:
cmp r0, r1
- bne .L849
+ bne .L870
mov r0, r3
pop {r4, pc}
-.L849:
+.L870:
lsrs r2, r3, #2
ldrb r4, [r0], #1 @ zero_extendqisi2
add r2, r2, r3, lsl #5
add r2, r2, r4
eors r3, r3, r2
- b .L848
-.L851:
+ b .L869
+.L872:
.align 2
-.L850:
+.L871:
.word 1204201446
.size js_hash, .-js_hash
.section .text.Ftl_write_map_blk_to_last_page,"ax",%progbits
@@ -6601,14 +6643,14 @@ Ftl_write_map_blk_to_last_page:
mov r4, r0
ldr r5, [r0, #12]
cmp r3, r2
- bne .L853
+ bne .L874
ldrh r3, [r0, #8]
- cbz r3, .L854
+ cbz r3, .L875
movw r2, #641
- ldr r1, .L862
- ldr r0, .L862+4
+ ldr r1, .L883
+ ldr r0, .L883+4
bl printf
-.L854:
+.L875:
ldrh r3, [r4, #8]
adds r3, r3, #1
strh r3, [r4, #8] @ movhi
@@ -6620,20 +6662,20 @@ Ftl_write_map_blk_to_last_page:
ldr r3, [r4, #28]
adds r3, r3, #1
str r3, [r4, #28]
-.L855:
+.L876:
movs r0, #0
pop {r3, r4, r5, r6, r7, r8, r10, pc}
-.L853:
+.L874:
ldrh r7, [r5, r3, lsl #1]
movs r1, #255
ldrh r3, [r0, #2]
- ldr r6, .L862+8
- ldr r10, .L862+24
+ ldr r6, .L883+8
+ ldr r10, .L883+24
ldr r8, [r0, #24]
orr r3, r3, r7, lsl #10
ldr r0, [r10]
str r3, [r6, #4]
- ldr r3, .L862+12
+ ldr r3, .L883+12
str r0, [r6, #8]
ldr r5, [r3]
ldr r3, [r4, #28]
@@ -6644,7 +6686,7 @@ Ftl_write_map_blk_to_last_page:
ldrh r3, [r4, #4]
strh r7, [r5, #2] @ movhi
strh r3, [r5] @ movhi
- ldr r3, .L862+16
+ ldr r3, .L883+16
ldrh r2, [r3]
lsls r2, r2, #3
bl ftl_memset
@@ -6652,11 +6694,11 @@ Ftl_write_map_blk_to_last_page:
movs r3, #0
ldr r1, [r10]
mov r2, r3
-.L856:
+.L877:
uxth r0, r3
cmp ip, r0
- bhi .L858
- ldr r3, .L862+20
+ bhi .L879
+ ldr r3, .L883+20
ldr r0, [r6, #8]
ldrh r1, [r3]
bl js_hash
@@ -6664,30 +6706,30 @@ Ftl_write_map_blk_to_last_page:
str r0, [r5, #12]
movs r3, #0
mov r1, r2
- ldr r0, .L862+8
+ ldr r0, .L883+8
bl FlashProgPages
ldrh r3, [r4, #2]
mov r0, r4
adds r3, r3, #1
strh r3, [r4, #2] @ movhi
bl ftl_map_blk_gc
- b .L855
-.L858:
+ b .L876
+.L879:
ldr r0, [r8, r3, lsl #2]
cmp r7, r0, lsr #10
- bne .L857
+ bne .L878
adds r2, r2, #1
uxth r2, r2
str r3, [r1, r2, lsl #3]
add lr, r1, r2, lsl #3
ldr r0, [r8, r3, lsl #2]
str r0, [lr, #4]
-.L857:
+.L878:
adds r3, r3, #1
- b .L856
-.L863:
+ b .L877
+.L884:
.align 2
-.L862:
+.L883:
.word .LANCHOR148
.word .LC1
.word .LANCHOR138
@@ -6709,13 +6751,13 @@ FtlMapWritePage:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r4, r5, r6, r7, r8, r10, fp, lr}
mov r4, r0
- ldr r8, .L888+32
+ ldr r8, .L909+32
mov r7, r1
movs r6, #0
str r2, [sp]
mov fp, r8
-.L865:
- ldr r2, .L888
+.L886:
+ ldr r2, .L909
ldr r3, [r2]
adds r3, r3, #1
str r3, [r2]
@@ -6723,44 +6765,44 @@ FtlMapWritePage:
ldrh r2, [r4, #2]
subs r3, r3, #1
cmp r2, r3
- bge .L866
+ bge .L887
ldrh r2, [r4]
movw r3, #65535
cmp r2, r3
- bne .L867
-.L866:
+ bne .L888
+.L887:
mov r0, r4
bl Ftl_write_map_blk_to_last_page
-.L867:
+.L888:
ldrh r2, [r4]
ldr r3, [r4, #12]
ldrh r3, [r3, r2, lsl #1]
- cbnz r3, .L868
+ cbnz r3, .L889
mov r2, #700
- ldr r1, .L888+4
- ldr r0, .L888+8
+ ldr r1, .L909+4
+ ldr r0, .L909+8
bl printf
-.L868:
+.L889:
ldrh r2, [r4]
ldrh r3, [r4, #10]
cmp r2, r3
- bcc .L869
+ bcc .L890
movw r2, #701
- ldr r1, .L888+4
- ldr r0, .L888+8
+ ldr r1, .L909+4
+ ldr r0, .L909+8
bl printf
-.L869:
+.L890:
ldrh r2, [r4]
movs r1, #0
ldr r3, [r4, #12]
- ldr r5, .L888+12
+ ldr r5, .L909+12
ldrh r3, [r3, r2, lsl #1]
ldrh r2, [r4, #2]
str r3, [sp, #4]
orr r2, r2, r3, lsl #10
ldr r3, [sp]
str r2, [r5, #4]
- ldr r2, .L888+16
+ ldr r2, .L909+16
str r3, [r5, #8]
ldr r0, [r2]
movs r2, #16
@@ -6773,7 +6815,7 @@ FtlMapWritePage:
str r1, [r10, #4]
ldrh r1, [r4, #4]
strh r3, [r10, #2] @ movhi
- ldr r3, .L888+20
+ ldr r3, .L909+20
strh r1, [r10] @ movhi
strh r7, [r10, #8] @ movhi
ldrh r1, [r3]
@@ -6790,10 +6832,10 @@ FtlMapWritePage:
uxth r2, r2
adds r3, r1, #1
strh r2, [r4, #2] @ movhi
- bne .L870
+ bne .L891
ldr r1, [r5, #4]
adds r6, r6, #1
- ldr r0, .L888+24
+ ldr r0, .L909+24
uxth r6, r6
bl printf
ldrh r2, [r4, #2]
@@ -6803,48 +6845,48 @@ FtlMapWritePage:
addls r2, r2, #-1
strhls r2, [r4, #2] @ movhi
cmp r6, #3
- bls .L872
+ bls .L893
mov r2, r6
ldr r1, [r5, #4]
- ldr r0, .L888+28
+ ldr r0, .L909+28
bl printf
-.L873:
- b .L873
-.L872:
+.L894:
+ b .L894
+.L893:
ldr r3, [r4, #32]
cmp r3, #0
- beq .L865
-.L887:
- b .L887
-.L870:
+ beq .L886
+.L908:
+ b .L908
+.L891:
cmp r2, #1
- beq .L876
+ beq .L897
cmp r1, #256
- beq .L876
+ beq .L897
ldr r0, [r4, #36]
- cbz r0, .L877
-.L876:
+ cbz r0, .L898
+.L897:
movs r3, #0
str r3, [r4, #36]
- b .L865
-.L877:
+ b .L886
+.L898:
ldr r2, [r5, #4]
ldr r3, [r4, #24]
str r2, [r3, r7, lsl #2]
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L889:
+.L910:
.align 2
-.L888:
+.L909:
.word .LANCHOR88
.word .LANCHOR149
.word .LC1
.word .LANCHOR138
.word .LANCHOR114
.word .LANCHOR23
- .word .LC18
- .word .LC19
+ .word .LC22
+ .word .LC23
.word .LANCHOR20
.size FtlMapWritePage, .-FtlMapWritePage
.section .text.load_l2p_region,"ax",%progbits
@@ -6858,31 +6900,31 @@ FtlMapWritePage:
load_l2p_region:
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L897
+ ldr r3, .L918
push {r0, r1, r4, r5, r6, r7, r8, r10, fp, lr}
mov r5, r0
mov r10, r1
ldrh r2, [r3]
str r3, [sp, #4]
cmp r2, r0
- bcs .L891
+ bcs .L912
movw r2, #485
- ldr r1, .L897+4
- ldr r0, .L897+8
+ ldr r1, .L918+4
+ ldr r0, .L918+8
bl printf
-.L891:
- ldr fp, .L897+48
+.L912:
+ ldr fp, .L918+48
movs r4, #12
- ldr r7, .L897+12
+ ldr r7, .L918+12
ldr r3, [fp]
ldr r8, [r3, r5, lsl #2]
cmp r8, #0
- bne .L892
+ bne .L913
mul r4, r4, r10
ldr r2, [r7]
movs r1, #255
adds r0, r2, r4
- ldr r2, .L897+16
+ ldr r2, .L918+16
ldr r0, [r0, #8]
ldrh r2, [r2]
bl ftl_memset
@@ -6890,21 +6932,21 @@ load_l2p_region:
adds r1, r2, r4
strh r5, [r2, r4] @ movhi
str r8, [r1, #4]
-.L893:
+.L914:
movs r0, #0
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L892:
+.L913:
mul r4, r4, r10
ldr r2, [r7]
- ldr r6, .L897+20
+ ldr r6, .L918+20
add r2, r2, r4
mov r0, r6
ldr r2, [r2, #8]
str r8, [r6, #4]
str r2, [r6, #8]
- ldr r2, .L897+24
+ ldr r2, .L918+24
ldr r2, [r2]
str r2, [r6, #12]
movs r2, #1
@@ -6913,55 +6955,55 @@ load_l2p_region:
ldr r10, [r6, #12]
ldrh r2, [r10, #8]
cmp r2, r5
- beq .L894
+ beq .L915
mov r2, r8
mov r1, r5
- ldr r0, .L897+28
+ ldr r0, .L918+28
bl printf
movs r3, #4
ldr r1, [r6, #12]
mov r2, r3
- ldr r0, .L897+32
+ ldr r0, .L918+32
bl rknand_print_hex
ldr r3, [sp, #4]
movs r2, #4
ldr r1, [fp]
- ldr r0, .L897+36
+ ldr r0, .L918+36
ldrh r3, [r3]
bl rknand_print_hex
-.L895:
+.L916:
ldrh r3, [r10, #8]
cmp r3, r5
- beq .L896
+ beq .L917
mov r2, #508
- ldr r1, .L897+4
- ldr r0, .L897+8
+ ldr r1, .L918+4
+ ldr r0, .L918+8
bl printf
-.L896:
+.L917:
ldr r3, [r7]
movs r1, #0
adds r2, r3, r4
str r1, [r2, #4]
strh r5, [r3, r4] @ movhi
- b .L893
-.L894:
+ b .L914
+.L915:
ldr r2, [r6]
cmp r2, #256
- bne .L895
+ bne .L916
mov r2, r8
mov r1, r5
- ldr r0, .L897+40
+ ldr r0, .L918+40
bl printf
ldr r3, [r7]
mov r1, r5
- ldr r0, .L897+44
+ ldr r0, .L918+44
add r3, r3, r4
ldr r2, [r3, #8]
bl FtlMapWritePage
- b .L895
-.L898:
+ b .L916
+.L919:
.align 2
-.L897:
+.L918:
.word .LANCHOR32
.word .LANCHOR150
.word .LC1
@@ -6969,10 +7011,10 @@ load_l2p_region:
.word .LANCHOR23
.word .LANCHOR138
.word .LANCHOR114
- .word .LC20
- .word .LC21
- .word .LC22
- .word .LC23
+ .word .LC24
+ .word .LC13
+ .word .LC25
+ .word .LC26
.word .LANCHOR129
.word .LANCHOR124
.size load_l2p_region, .-load_l2p_region
@@ -6997,13 +7039,13 @@ ftl_map_blk_gc:
ldrh r2, [r4, #8]
subs r3, r3, #5
cmp r2, r3
- blt .L900
+ blt .L921
uxth r0, r0
ldrh r8, [r5, r0, lsl #1]
cmp r8, #0
- beq .L900
+ beq .L921
ldr r3, [r4, #32]
- cbnz r3, .L900
+ cbnz r3, .L921
movs r2, #1
str r2, [r4, #32]
strh r3, [r5, r0, lsl #1] @ movhi
@@ -7011,39 +7053,39 @@ ftl_map_blk_gc:
ldrh r2, [r4, #2]
subs r3, r3, #1
strh r3, [r4, #8] @ movhi
- ldr r3, .L915
+ ldr r3, .L936
ldrh r3, [r3]
cmp r2, r3
- bcc .L901
+ bcc .L922
mov r0, r4
bl ftl_map_blk_alloc_new_blk
-.L901:
- ldr r5, .L915+4
+.L922:
+ ldr r5, .L936+4
movs r6, #0
-.L902:
+.L923:
ldrh r3, [r4, #6]
uxth r10, r6
cmp r3, r10
- bhi .L909
+ bhi .L930
movs r1, #1
mov r0, r8
bl FtlFreeSysBlkQueueIn
movs r3, #0
str r3, [r4, #32]
-.L900:
- ldr r3, .L915
+.L921:
+ ldr r3, .L936
ldrh r2, [r4, #2]
ldrh r3, [r3]
cmp r2, r3
- bcc .L910
+ bcc .L931
mov r0, r4
bl ftl_map_blk_alloc_new_blk
-.L910:
+.L931:
movs r0, #0
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L909:
+.L930:
ldr r3, [sp]
uxth fp, r6
add r3, r3, fp, lsl #2
@@ -7051,53 +7093,53 @@ ftl_map_blk_gc:
ldr r3, [sp]
ldr r2, [r3, fp, lsl #2]
cmp r8, r2, lsr #10
- bne .L903
- ldr r3, .L915+8
+ bne .L924
+ ldr r3, .L936+8
str r2, [r5, #4]
movs r2, #1
- ldr r0, .L915+4
+ ldr r0, .L936+4
ldr r1, [r3]
str r1, [r5, #8]
- ldr r1, .L915+12
+ ldr r1, .L936+12
ldr r7, [r1]
mov r1, r2
str r7, [r5, #12]
bl FlashReadPages
ldrh r2, [r7, #8]
cmp r2, r10
- beq .L904
+ beq .L925
movw r2, #611
- ldr r1, .L915+16
- ldr r0, .L915+20
+ ldr r1, .L936+16
+ ldr r0, .L936+20
bl printf
-.L904:
+.L925:
ldr r2, [r5]
adds r2, r2, #1
- bne .L905
-.L907:
+ bne .L926
+.L928:
ldr r2, [sp, #4]
movs r3, #0
str r3, [r2]
-.L906:
- b .L906
-.L905:
+.L927:
+ b .L927
+.L926:
ldrh r2, [r7, #8]
cmp r2, r10
- bne .L907
+ bne .L928
ldrh r1, [r7]
ldrh r2, [r4, #4]
cmp r1, r2
- bne .L907
+ bne .L928
ldr r2, [r5, #8]
mov r1, fp
mov r0, r4
bl FtlMapWritePage
-.L903:
+.L924:
adds r6, r6, #1
- b .L902
-.L916:
+ b .L923
+.L937:
.align 2
-.L915:
+.L936:
.word .LANCHOR20
.word .LANCHOR138
.word .LANCHOR107
@@ -7118,9 +7160,9 @@ flush_l2p_region:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, lr}
movs r4, #12
- ldr r5, .L918
+ ldr r5, .L939
muls r4, r0, r4
- ldr r0, .L918+4
+ ldr r0, .L939+4
ldr r3, [r5]
adds r2, r3, r4
ldrh r1, [r3, r4]
@@ -7133,9 +7175,9 @@ flush_l2p_region:
bic r3, r3, #-2147483648
str r3, [r4, #4]
pop {r3, r4, r5, pc}
-.L919:
+.L940:
.align 2
-.L918:
+.L939:
.word .LANCHOR55
.word .LANCHOR129
.size flush_l2p_region, .-flush_l2p_region
@@ -7152,30 +7194,30 @@ l2p_flush:
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, r5, r6, lr}
movs r4, #0
- ldr r5, .L924
- ldr r6, .L924+4
-.L921:
+ ldr r5, .L945
+ ldr r6, .L945+4
+.L942:
ldrh r3, [r5]
uxth r0, r4
cmp r3, r0
- bhi .L923
+ bhi .L944
movs r0, #0
pop {r4, r5, r6, pc}
-.L923:
+.L944:
ldr r2, [r6]
uxth r3, r4
movs r1, #12
mla r3, r1, r3, r2
ldr r3, [r3, #4]
cmp r3, #0
- bge .L922
+ bge .L943
bl flush_l2p_region
-.L922:
+.L943:
adds r4, r4, #1
- b .L921
-.L925:
+ b .L942
+.L946:
.align 2
-.L924:
+.L945:
.word .LANCHOR33
.word .LANCHOR55
.size l2p_flush, .-l2p_flush
@@ -7192,36 +7234,36 @@ log2phys:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r4, r5, r6, r7, r8, r10, fp, lr}
mov r7, r2
- ldr r4, .L939
+ ldr r4, .L960
mov r10, r0
mov r5, r1
- ldr r3, .L939+4
+ ldr r3, .L960+4
ldr r2, [r4]
ldrh fp, [r3]
cmp r0, r2
- bcc .L927
+ bcc .L948
movw r2, #813
- ldr r1, .L939+8
- ldr r0, .L939+12
+ ldr r1, .L960+8
+ ldr r0, .L960+12
bl printf
-.L927:
+.L948:
ldr r3, [r4]
cmp r10, r3
- bcs .L928
- ldr r3, .L939+16
+ bcs .L949
+ ldr r3, .L960+16
add fp, fp, #7
lsr r6, r10, fp
movs r2, #0
ldrh r1, [r3]
uxth r6, r6
- ldr r3, .L939+20
+ ldr r3, .L960+20
ldr r0, [r3]
mov r8, r3
movs r3, #12
-.L929:
+.L950:
uxth r4, r2
cmp r4, r1
- bcc .L934
+ bcc .L955
str r3, [sp, #4]
bl select_l2p_ram_region
ldr r3, [sp, #4]
@@ -7232,31 +7274,31 @@ log2phys:
ldrh r2, [r2, r3]
movw r3, #65535
cmp r2, r3
- beq .L935
+ beq .L956
ldr r3, [r1, #4]
cmp r3, #0
- bge .L935
+ bge .L956
bl flush_l2p_region
-.L935:
+.L956:
mov r1, r4
mov r0, r6
bl load_l2p_region
- b .L931
-.L928:
+ b .L952
+.L949:
mov r0, #-1
- cbnz r7, .L926
+ cbnz r7, .L947
str r0, [r5]
-.L926:
+.L947:
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L934:
+.L955:
adds r2, r2, #1
mla ip, r3, r2, r0
ldrh ip, [ip, #-12]
cmp ip, r6
- bne .L929
-.L931:
+ bne .L950
+.L952:
movs r0, #1
ldr r2, [r8]
lsl r0, r0, fp
@@ -7265,35 +7307,35 @@ log2phys:
and r0, r0, r10
uxth r0, r0
mla r3, r3, r4, r2
- cbnz r7, .L932
+ cbnz r7, .L953
ldr r3, [r3, #8]
ldr r3, [r3, r0, lsl #2]
str r3, [r5]
-.L933:
+.L954:
ldr r2, [r8]
movs r3, #12
mla r4, r3, r4, r2
ldr r3, [r4, #4]
adds r2, r3, #1
- beq .L937
+ beq .L958
adds r3, r3, #1
str r3, [r4, #4]
-.L937:
+.L958:
movs r0, #0
- b .L926
-.L932:
+ b .L947
+.L953:
ldr r1, [r5]
ldr r2, [r3, #8]
str r1, [r2, r0, lsl #2]
ldr r2, [r3, #4]
orr r2, r2, #-2147483648
str r2, [r3, #4]
- ldr r3, .L939+24
+ ldr r3, .L960+24
strh r6, [r3] @ movhi
- b .L933
-.L940:
+ b .L954
+.L961:
.align 2
-.L939:
+.L960:
.word .LANCHOR152
.word .LANCHOR22
.word .LANCHOR153
@@ -7315,22 +7357,22 @@ FtlReUsePrevPpa:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r4, r5, r6, r7, r8, lr}
mov r6, r0
- ldr r5, .L951
+ ldr r5, .L972
ubfx r0, r1, #10, #16
str r1, [sp, #4]
bl P2V_block_in_plane
ldr r2, [r5]
mov r7, r0
ldrh r3, [r2, r0, lsl #1]
- cbnz r3, .L942
- ldr r2, .L951+4
+ cbnz r3, .L963
+ ldr r2, .L972+4
ldr r4, [r2]
cmp r4, #0
- beq .L943
- ldr r2, .L951+8
+ beq .L964
+ ldr r2, .L972+8
movw lr, #65535
- ldr ip, .L951+24
- ldr r0, .L951+12
+ ldr ip, .L972+24
+ ldr r0, .L972+12
ldr r2, [r2]
ldrh r1, [r0]
mov r8, r0
@@ -7339,22 +7381,22 @@ FtlReUsePrevPpa:
mul r4, ip, r4
mov ip, #6
uxth r4, r4
-.L944:
+.L965:
uxth r0, r3
cmp r1, r0
- bls .L943
+ bls .L964
cmp r4, r7
- bne .L945
+ bne .L966
mov r1, r4
- ldr r0, .L951+4
+ ldr r0, .L972+4
bl List_remove_node
ldrh r3, [r8]
- cbnz r3, .L946
+ cbnz r3, .L967
movw r2, #1733
- ldr r1, .L951+16
- ldr r0, .L951+20
+ ldr r1, .L972+16
+ ldr r0, .L972+20
bl printf
-.L946:
+.L967:
ldrh r3, [r8]
mov r0, r4
subs r3, r3, #1
@@ -7362,17 +7404,17 @@ FtlReUsePrevPpa:
bl INSERT_DATA_LIST
ldr r2, [r5]
ldrh r3, [r2, r7, lsl #1]
-.L942:
+.L963:
adds r3, r3, #1
strh r3, [r2, r7, lsl #1] @ movhi
- b .L943
-.L945:
+ b .L964
+.L966:
mul r4, ip, r4
adds r3, r3, #1
ldrh r4, [r2, r4]
cmp r4, lr
- bne .L944
-.L943:
+ bne .L965
+.L964:
movs r2, #1
add r1, sp, #4
mov r0, r6
@@ -7380,11 +7422,11 @@ FtlReUsePrevPpa:
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, pc}
-.L952:
+.L973:
.align 2
-.L951:
+.L972:
.word .LANCHOR42
- .word .LANCHOR47
+ .word .LANCHOR46
.word .LANCHOR40
.word .LANCHOR48
.word .LANCHOR154
@@ -7408,144 +7450,144 @@ FtlRecoverySuperblock:
mov r8, r0
sub sp, sp, #48
cmp r3, r2
- beq .L1081
+ beq .L1106
ldrh r3, [r0, #2]
str r3, [sp, #4]
ldrb r3, [r0, #6] @ zero_extendqisi2
ldr r1, [sp, #4]
str r3, [sp, #20]
- ldr r3, .L1091
+ ldr r3, .L1115
ldrh r3, [r3]
cmp r3, r1
mov r3, #0
- bne .L956
+ bne .L977
strh r3, [r0, #4] @ movhi
-.L1089:
+.L1113:
strb r3, [r8, #6]
-.L1081:
+.L1106:
movs r0, #0
add sp, sp, #48
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L956:
+.L977:
ldrh r0, [r0, #16]
-.L957:
+.L978:
cmp r0, r2
uxth r5, r3
add r3, r3, #1
- beq .L958
+ beq .L979
movs r1, #1
bl FtlGetLastWrittenPage
mov r4, r0
adds r0, r0, #1
- beq .L959
- ldr r3, .L1091+4
+ beq .L980
+ ldr r3, .L1115+4
movs r2, #0
mov r5, r2
movw fp, #65535
mov r10, #20
ldrh ip, [r3]
- ldr r3, .L1091+8
+ ldr r3, .L1115+8
ldr r0, [r3]
- ldr r3, .L1091+12
+ ldr r3, .L1115+12
ldr r3, [r3]
str r3, [sp, #8]
- ldr r3, .L1091+16
+ ldr r3, .L1115+16
ldrh r7, [r3]
- ldr r3, .L1091+20
+ ldr r3, .L1115+20
ldr r3, [r3]
str r3, [sp, #12]
- ldr r3, .L1091+24
+ ldr r3, .L1115+24
ldrh lr, [r3]
add r3, r8, #16
str r3, [sp, #16]
str r3, [sp]
-.L960:
+.L981:
uxth r3, r2
cmp ip, r3
- bhi .L964
+ bhi .L985
movs r2, #0
mov r1, r5
bl FlashReadPages
- ldr r2, .L1091+28
+ ldr r2, .L1115+28
uxth r1, r4
movw fp, #65535
str r1, [sp, #12]
ldr r3, [r2]
subs r3, r3, #1
str r3, [sp]
- ldr r3, .L1091+8
+ ldr r3, .L1115+8
ldr r10, [r3]
movs r3, #0
mov r7, r10
-.L965:
+.L986:
uxth r1, r3
cmp r5, r1
- bhi .L970
- bne .L968
+ bhi .L991
+ bne .L989
adds r3, r4, #1
uxth r3, r3
str r3, [sp, #8]
-.L1082:
+.L1107:
ldr r0, [r10, #4]
ubfx r0, r0, #10, #16
bl P2V_plane
- ldr r3, .L1091
+ ldr r3, .L1115
mov r10, r0
ldr r2, [sp, #8]
ldrh r3, [r3]
cmp r3, r2
- bne .L972
+ bne .L993
ldrh r3, [sp, #8]
strh r3, [r8, #2] @ movhi
movs r3, #0
strb r3, [r8, #6]
strh r3, [r8, #4] @ movhi
-.L972:
+.L993:
ldr r3, [sp, #8]
ldr r2, [sp, #4]
cmp r3, r2
- bne .L973
+ bne .L994
ldr r3, [sp, #20]
cmp r10, r3
- bne .L973
+ bne .L994
ldr r1, [sp, #8]
mov r2, r10
-.L1090:
+.L1114:
mov r0, r8
bl ftl_sb_update_avl_pages
- b .L1081
-.L958:
+ b .L1106
+.L979:
uxth r1, r3
adds r1, r1, #8
ldrh r0, [r8, r1, lsl #1]
- b .L957
-.L959:
+ b .L978
+.L980:
ldr r3, [sp, #4]
- cbz r3, .L961
+ cbz r3, .L982
mov r2, #1800
- ldr r1, .L1091+32
- ldr r0, .L1091+36
+ ldr r1, .L1115+32
+ ldr r0, .L1115+36
bl printf
-.L961:
+.L982:
ldr r3, [sp, #20]
- cbz r3, .L962
+ cbz r3, .L983
cmp r5, r3
- beq .L962
+ beq .L983
movw r2, #1801
- ldr r1, .L1091+32
- ldr r0, .L1091+36
+ ldr r1, .L1115+32
+ ldr r0, .L1115+36
bl printf
-.L962:
+.L983:
movs r3, #0
strh r3, [r8, #2] @ movhi
- b .L1089
-.L964:
+ b .L1113
+.L985:
ldr r1, [sp]
ldrh r3, [r1], #2
cmp r3, fp
str r1, [sp]
- beq .L963
+ beq .L984
mla r1, r10, r5, r0
ldr r6, [sp, #8]
orr r3, r4, r3, lsl #10
@@ -7561,53 +7603,53 @@ FtlRecoverySuperblock:
bic r3, r3, #3
add r3, r3, r6
str r3, [r1, #12]
-.L963:
+.L984:
adds r2, r2, #1
- b .L960
-.L970:
+ b .L981
+.L991:
ldr r1, [r7]
- cbnz r1, .L966
+ cbnz r1, .L987
ldr r1, [r7, #12]
ldr r6, [r1, #4]
str r1, [sp, #8]
adds r1, r6, #1
- beq .L967
+ beq .L988
ldr r1, [r2]
mov r0, r6
bl ftl_cmp_data_ver
- cbz r0, .L967
+ cbz r0, .L988
adds r6, r6, #1
str r6, [r2]
-.L967:
+.L988:
ldr r1, [sp, #8]
ldr r1, [r1]
adds r1, r1, #1
- bne .L969
-.L968:
+ bne .L990
+.L989:
uxth r2, r4
uxth r3, r3
str r2, [sp, #8]
movs r2, #20
mla r10, r2, r3, r10
- b .L1082
-.L966:
+ b .L1107
+.L987:
ldr fp, [sp, #12]
-.L969:
+.L990:
adds r3, r3, #1
adds r7, r7, #20
- b .L965
-.L973:
+ b .L986
+.L994:
movw r3, #65535
cmp fp, r3
- bne .L974
+ bne .L995
ldrb r3, [r8, #8] @ zero_extendqisi2
cmp r3, #0
- bne .L975
-.L974:
- ldr r3, .L1091+40
+ bne .L996
+.L995:
+ ldr r3, .L1115+40
uxth r6, r4
uxth r4, r4
- ldr r7, .L1091+8
+ ldr r7, .L1115+8
ldr r2, [r3]
adds r2, r2, #1
itt eq
@@ -7620,10 +7662,10 @@ FtlRecoverySuperblock:
subgt r4, r6, #7
ldrle r4, [sp, #4]
uxthgt r4, r4
-.L978:
+.L999:
cmp r4, r6
- bhi .L988
- ldr r3, .L1091+4
+ bhi .L1009
+ ldr r3, .L1115+4
movw lr, #65535
ldr r0, [r7]
mov ip, #20
@@ -7632,47 +7674,47 @@ FtlRecoverySuperblock:
str r3, [sp, #12]
movs r3, #0
mov r5, r3
- b .L989
-.L980:
+ b .L1010
+.L1001:
ldr r1, [sp, #12]
ldrh r2, [r1], #2
cmp r2, lr
str r1, [sp, #12]
- beq .L979
+ beq .L1000
mla r1, ip, r5, r0
adds r5, r5, #1
orr r2, r4, r2, lsl #10
uxth r5, r5
str r2, [r1, #4]
-.L979:
+.L1000:
adds r3, r3, #1
-.L989:
+.L1010:
uxth r2, r3
cmp fp, r2
- bhi .L980
+ bhi .L1001
mov r1, r5
movs r2, #0
bl FlashReadPages
- ldr r3, .L1091+40
+ ldr r3, .L1115+40
movs r1, #20
movs r0, #0
movw ip, #65535
ldr r2, [r3]
ldr r3, [r7]
mla r5, r1, r5, r3
-.L981:
+.L1002:
cmp r5, r3
- bne .L986
- cbz r0, .L987
- ldr r3, .L1091+40
+ bne .L1007
+ cbz r0, .L1008
+ ldr r3, .L1115+40
str r2, [r3]
-.L987:
+.L1008:
adds r4, r4, #1
uxth r4, r4
- b .L978
-.L1092:
+ b .L999
+.L1116:
.align 2
-.L1091:
+.L1115:
.word .LANCHOR19
.word .LANCHOR3
.word .LANCHOR103
@@ -7684,22 +7726,22 @@ FtlRecoverySuperblock:
.word .LANCHOR155
.word .LC1
.word .LANCHOR134
-.L986:
+.L1007:
ldr r1, [r3]
cmp r1, #0
- beq .L982
- cbz r0, .L975
-.L1083:
- ldr r3, .L1093
+ beq .L1003
+ cbz r0, .L996
+.L1108:
+ ldr r3, .L1117
str r2, [r3]
-.L975:
+.L996:
ldr fp, [sp, #4]
movs r2, #1
- ldr r6, .L1093+4
- ldr r3, .L1093+8
+ ldr r6, .L1117+4
+ ldr r3, .L1117+8
strh r2, [r3] @ movhi
-.L990:
- ldr r3, .L1093+12
+.L1011:
+ ldr r3, .L1117+12
movw lr, #65535
ldr r0, [r6]
movs r7, #20
@@ -7707,64 +7749,64 @@ FtlRecoverySuperblock:
ldrh r4, [r3]
movs r3, #0
str r3, [sp, #12]
-.L991:
+.L1012:
uxth r2, r3
cmp r4, r2
- bhi .L993
+ bhi .L1014
movs r2, #0
ldr r1, [sp, #12]
bl FlashReadPages
movs r3, #0
-.L1088:
+.L1112:
str r3, [sp, #24]
ldr r2, [sp, #12]
ldrh r3, [sp, #24]
cmp r2, r3
- bhi .L1024
- ldr r3, .L1093+16
+ bhi .L1043
+ ldr r3, .L1117+16
add fp, fp, #1
uxth fp, fp
ldrh r3, [r3]
cmp r3, fp
- bne .L990
- ldr r2, .L1093+12
+ bne .L1011
+ ldr r2, .L1117+12
movw r0, #65535
movs r3, #0
strh fp, [r8, #2] @ movhi
strh r3, [r8, #4] @ movhi
ldrh r2, [r2]
-.L1025:
+.L1044:
uxth r1, r3
cmp r1, r2
- bcs .L1081
+ bcs .L1106
ldr r1, [sp, #16]
ldrh r4, [r1], #2
cmp r4, r0
str r1, [sp, #16]
add r1, r3, #1
- bne .L1089
+ bne .L1113
mov r3, r1
- b .L1025
-.L982:
+ b .L1044
+.L1003:
ldr r1, [r3, #12]
ldrh lr, [r1]
cmp lr, ip
- beq .L985
+ beq .L1006
ldr r1, [r1, #4]
cmp r1, #-1
itt ne
movne r2, r1
movne r0, #1
-.L985:
+.L1006:
adds r3, r3, #20
- b .L981
-.L988:
+ b .L1002
+.L1009:
mov r2, #-1
- b .L1083
-.L993:
+ b .L1108
+.L1014:
ldrh r2, [r1], #2
cmp r2, lr
- beq .L992
+ beq .L1013
ldr r5, [sp, #12]
orr r2, fp, r2, lsl #10
mla ip, r7, r5, r0
@@ -7773,10 +7815,10 @@ FtlRecoverySuperblock:
adds r2, r2, #1
uxth r2, r2
str r2, [sp, #12]
-.L992:
+.L1013:
adds r3, r3, #1
- b .L991
-.L1024:
+ b .L1012
+.L1043:
ldr r3, [sp, #24]
movs r5, #20
muls r5, r3, r5
@@ -7789,45 +7831,45 @@ FtlRecoverySuperblock:
bl P2V_plane
ldr r3, [sp, #4]
cmp fp, r3
- bcc .L995
+ bcc .L1016
ldr r3, [sp, #28]
- bne .L996
+ bne .L1017
ldr r2, [sp, #20]
cmp r2, r0
- bhi .L995
-.L996:
+ bhi .L1016
+.L1017:
ldr r2, [sp, #8]
cmp fp, r2
- bne .L997
+ bne .L1018
cmp r10, r0
- beq .L998
-.L997:
+ beq .L1019
+.L1018:
ldr r3, [r3, r5]
adds r3, r3, #1
- beq .L999
+ beq .L1020
ldr r3, [r7, #12]
movw r2, #61589
ldrh r1, [r3]
cmp r1, r2
- beq .L1000
+ beq .L1021
ldrh r0, [r8]
-.L1086:
+.L1109:
bl decrement_vpc_count
- b .L995
-.L1000:
+ b .L1016
+.L1021:
ldr r2, [r3, #4]
str r2, [sp]
adds r2, r2, #1
- beq .L1001
- ldr r2, .L1093+20
+ beq .L1022
+ ldr r2, .L1117+20
ldr r0, [sp]
ldr r1, [r2]
bl ftl_cmp_data_ver
- cbz r0, .L1001
+ cbz r0, .L1022
ldr r1, [sp]
adds r1, r1, #1
str r1, [r2]
-.L1001:
+.L1022:
ldr r4, [r3, #8]
add r1, sp, #40
ldr r3, [r3, #12]
@@ -7835,17 +7877,17 @@ FtlRecoverySuperblock:
mov r0, r4
str r3, [sp, #36]
bl log2phys
- ldr r3, .L1093
+ ldr r3, .L1117
ldr r1, [r3]
adds r3, r1, #1
- beq .L1002
+ beq .L1023
ldr r0, [sp]
bl ftl_cmp_data_ver
cmp r0, #0
- beq .L1002
+ beq .L1023
ldr r3, [sp, #36]
adds r7, r3, #1
- beq .L1003
+ beq .L1024
ldr r0, [r6]
movs r2, #0
movs r1, #1
@@ -7857,103 +7899,119 @@ FtlRecoverySuperblock:
ldr r1, [r2, r5]
adds r3, r2, r5
adds r1, r1, #1
- bne .L1004
-.L1005:
+ bne .L1025
+.L1026:
mov r3, #-1
str r3, [sp, #36]
-.L1012:
+.L1033:
ldr r7, [sp, #36]
adds r0, r7, #1
- beq .L995
-.L1028:
+ beq .L1016
+.L1047:
ubfx r0, r7, #10, #16
bl P2V_block_in_plane
- ldr r3, .L1093+24
+ ldr r3, .L1117+24
mov r4, r0
ldrh r3, [r3]
cmp r3, r0
- bhi .L1020
- movw r2, #2065
- ldr r1, .L1093+28
- ldr r0, .L1093+32
+ bhi .L1039
+ movw r2, #2057
+ ldr r1, .L1117+28
+ ldr r0, .L1117+32
bl printf
-.L1020:
- ldr r3, .L1093+36
+.L1039:
+ ldr r3, .L1117+36
ldr r3, [r3]
ldrh r3, [r3, r4, lsl #1]
cmp r3, #0
- beq .L1021
+ beq .L1040
mov r0, r4
- b .L1086
-.L1003:
+ b .L1109
+.L1024:
ldr r3, [sp, #44]
ldr r2, [sp, #40]
cmp r2, r3
- bne .L995
+ bne .L1016
movs r2, #1
add r1, sp, #36
mov r0, r4
bl log2phys
-.L995:
+.L1016:
ldr r3, [sp, #24]
adds r3, r3, #1
- b .L1088
-.L1004:
+ b .L1112
+.L1025:
ldr r1, [r7, #8]
cmp r4, r1
- bne .L1005
- ldr r0, .L1093
+ bne .L1026
+ ldr r0, .L1117
ldr r1, [r7, #4]
ldr r0, [r0]
str r1, [sp, #28]
bl ftl_cmp_data_ver
cmp r0, #0
- beq .L1005
+ beq .L1026
ldr r1, [sp, #40]
ldr r0, [sp, #44]
cmp r1, r0
- bne .L1007
-.L1010:
+ bne .L1028
+.L1031:
ldr r1, [sp, #36]
mov r0, r4
bl FtlReUsePrevPpa
- b .L1005
-.L1007:
+ b .L1026
+.L1028:
ldr r0, [sp, #36]
cmp r1, r0
- beq .L1005
+ beq .L1026
adds r0, r1, #1
- beq .L1008
+ beq .L1029
str r1, [r3, #4]
movs r2, #0
movs r1, #1
mov r0, r3
ldr r7, [r3, #12]
bl FlashReadPages
-.L1009:
+.L1030:
ldr r3, [r6]
ldr r3, [r3, r5]
adds r3, r3, #1
- beq .L1010
+ beq .L1031
ldr r3, [r7, #4]
- ldr r2, .L1093
+ ldr r2, .L1117
mov r1, r3
ldr r0, [r2]
bl ftl_cmp_data_ver
cmp r0, #0
- beq .L1010
+ beq .L1031
mov r1, r3
ldr r0, [sp, #28]
bl ftl_cmp_data_ver
cmp r0, #0
- beq .L1005
- b .L1010
-.L1008:
+ beq .L1026
+ b .L1031
+.L1029:
str r1, [r2, r5]
- b .L1009
-.L1094:
+ b .L1030
+.L1023:
+ ldr r3, [sp, #44]
+ ldr r2, [sp, #40]
+ cmp r2, r3
+ beq .L1033
+ ldr r1, [sp, #36]
+ adds r7, r1, #1
+ beq .L1035
+ ldr r3, .L1117+40
+ ldr r3, [r3]
+ cmp r3, r1, lsr #10
+ bhi .L1035
+ ldr r0, .L1117+44
+.L1111:
+ bl printf
+ b .L1016
+.L1118:
.align 2
-.L1093:
+.L1117:
.word .LANCHOR134
.word .LANCHOR103
.word .LANCHOR156
@@ -7964,44 +8022,34 @@ FtlRecoverySuperblock:
.word .LANCHOR155
.word .LC1
.word .LANCHOR42
-.L1002:
- ldr r3, [sp, #44]
- ldr r2, [sp, #40]
- cmp r2, r3
- beq .L1012
- ldr r2, .L1095
- ldr r3, [sp, #36]
- ldr r2, [r2]
- cmp r2, r3, lsr #10
- bhi .L1014
- adds r3, r3, #1
-.L1085:
- bne .L995
+ .word .LANCHOR8
+ .word .LC27
+.L1035:
movs r2, #1
add r1, sp, #44
mov r0, r4
bl log2phys
ldr r7, [sp, #40]
adds r5, r7, #1
- beq .L1012
+ beq .L1033
ldr r3, [sp, #36]
cmp r7, r3
- beq .L1028
+ beq .L1047
ubfx r0, r7, #10, #16
bl P2V_block_in_plane
- ldr r3, .L1095+4
+ ldr r3, .L1119
ldrh r3, [r3]
cmp r3, r0
- beq .L1019
- ldr r3, .L1095+8
+ beq .L1038
+ ldr r3, .L1119+4
ldrh r3, [r3]
cmp r3, r0
- beq .L1019
- ldr r3, .L1095+12
+ beq .L1038
+ ldr r3, .L1119+8
ldrh r3, [r3]
cmp r3, r0
- bne .L1012
-.L1019:
+ bne .L1033
+.L1038:
ldr r0, [r6]
movs r2, #0
movs r1, #1
@@ -8011,77 +8059,61 @@ FtlRecoverySuperblock:
ldr r3, [r6]
ldr r3, [r3]
adds r3, r3, #1
- beq .L1012
+ beq .L1033
ldr r1, [r5, #4]
ldr r0, [sp]
bl ftl_cmp_data_ver
cmp r0, #0
- bne .L1012
+ bne .L1033
movs r2, #1
add r1, sp, #40
mov r0, r4
bl log2phys
- b .L1012
-.L1014:
- ldr r0, [r6]
- movs r2, #0
- movs r1, #1
- ldr r5, [r0, #12]
- str r3, [r0, #4]
- bl FlashReadPages
- ldr r3, [r5, #8]
- cmp r4, r3
- bne .L995
- ldrh r2, [r5]
- movw r3, #61589
- cmp r2, r3
- b .L1085
-.L1021:
+ b .L1033
+.L1040:
mov r1, r4
- ldr r0, .L1095+16
- bl printf
- b .L995
-.L999:
- ldr r3, .L1095+20
+ ldr r0, .L1119+12
+ b .L1111
+.L1020:
+ ldr r3, .L1119+16
ldr r3, [r3]
cmp r3, #31
- bhi .L1022
- ldr r2, .L1095+24
+ bhi .L1041
+ ldr r2, .L1119+20
str r4, [r2, r3, lsl #2]
adds r3, r3, #1
- ldr r2, .L1095+20
+ ldr r2, .L1119+16
str r3, [r2]
-.L1022:
+.L1041:
ldrh r0, [r8]
bl decrement_vpc_count
- ldr r3, .L1095+28
+ ldr r3, .L1119+24
ldr r2, [r3]
adds r1, r2, #1
- bne .L1023
+ bne .L1042
ldr r2, [sp]
-.L1087:
+.L1110:
str r2, [r3]
- b .L995
-.L1023:
+ b .L1016
+.L1042:
ldr r1, [sp]
cmp r1, r2
- bcs .L995
+ bcs .L1016
mov r2, r1
- b .L1087
-.L998:
+ b .L1110
+.L1019:
strb r10, [r8, #6]
mov r2, r10
strh fp, [r8, #2] @ movhi
mov r1, fp
- b .L1090
-.L1096:
+ b .L1114
+.L1120:
.align 2
-.L1095:
- .word .LANCHOR8
+.L1119:
.word .LANCHOR51
.word .LANCHOR52
.word .LANCHOR53
- .word .LC24
+ .word .LC28
.word .LANCHOR157
.word .LANCHOR158
.word .LANCHOR134
@@ -8099,56 +8131,56 @@ ftl_check_vpc:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r4, r5, r6, r7, r8, r10, fp, lr}
movs r4, #0
- ldr r6, .L1121
- ldr r5, .L1121+4
- ldr r1, .L1121+8
- ldr r0, .L1121+12
+ ldr r6, .L1145
+ ldr r5, .L1145+4
+ ldr r1, .L1145+8
+ ldr r0, .L1145+12
bl printf
mov r2, #8192
movs r1, #0
- ldr r0, .L1121+4
+ ldr r0, .L1145+4
bl ftl_memset
-.L1098:
+.L1122:
ldr r3, [r6]
cmp r4, r3
- bcc .L1100
- ldr r10, .L1121+48
+ bcc .L1124
+ ldr r10, .L1145+48
movs r4, #0
- ldr r7, .L1121+16
+ ldr r7, .L1145+16
mov r6, r4
-.L1101:
+.L1125:
ldrh r2, [r10]
uxth r3, r4
cmp r2, r3
- bhi .L1103
- ldr r3, .L1121+20
+ bhi .L1127
+ ldr r3, .L1145+20
ldr r4, [r3]
- cbz r4, .L1104
- ldr r3, .L1121+24
+ cbz r4, .L1128
+ ldr r3, .L1145+24
mov r8, #0
- ldr r5, .L1121+28
- ldr r10, .L1121+16
+ ldr r5, .L1145+28
+ ldr r10, .L1145+16
ldrh r7, [r3]
ldr r3, [r5]
- ldr fp, .L1121+4
+ ldr fp, .L1145+4
subs r4, r4, r3
- ldr r3, .L1121+32
+ ldr r3, .L1145+32
asrs r4, r4, #1
muls r4, r3, r4
uxth r4, r4
-.L1105:
+.L1129:
uxth r3, r8
cmp r7, r3
- bls .L1104
+ bls .L1128
ldr r3, [r10]
ldrh r2, [r3, r4, lsl #1]
- cbz r2, .L1106
+ cbz r2, .L1130
movs r6, #1
ldrh r3, [fp, r4, lsl #1]
mov r1, r4
- ldr r0, .L1121+36
+ ldr r0, .L1145+36
bl printf
-.L1106:
+.L1130:
movs r3, #6
ldr r2, [r5]
muls r4, r3, r4
@@ -8156,71 +8188,71 @@ ftl_check_vpc:
add r8, r8, #1
ldrh r4, [r2, r4]
cmp r4, r3
- bne .L1105
-.L1104:
- cbz r6, .L1097
- movw r2, #2389
- ldr r1, .L1121+8
- ldr r0, .L1121+40
+ bne .L1129
+.L1128:
+ cbz r6, .L1121
+ movw r2, #2383
+ ldr r1, .L1145+8
+ ldr r0, .L1145+40
bl printf
-.L1097:
+.L1121:
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1100:
+.L1124:
movs r2, #0
add r1, sp, #4
mov r0, r4
bl log2phys
ldr r0, [sp, #4]
adds r3, r0, #1
- beq .L1099
+ beq .L1123
ubfx r0, r0, #10, #16
bl P2V_block_in_plane
ldrh r3, [r5, r0, lsl #1]
adds r3, r3, #1
strh r3, [r5, r0, lsl #1] @ movhi
-.L1099:
+.L1123:
adds r4, r4, #1
- b .L1098
-.L1103:
+ b .L1122
+.L1127:
ldr r3, [r7]
uxth r5, r4
- ldr r8, .L1121+4
+ ldr r8, .L1145+4
ldrh r2, [r3, r5, lsl #1]
ldrh r3, [r8, r5, lsl #1]
cmp r2, r3
- beq .L1102
+ beq .L1126
mov r1, r5
- ldr r0, .L1121+44
+ ldr r0, .L1145+44
bl printf
ldr r3, [r7]
movw r2, #65535
ldrh r3, [r3, r5, lsl #1]
cmp r3, r2
- beq .L1102
+ beq .L1126
ldrh r2, [r8, r5, lsl #1]
cmp r2, r3
it hi
movhi r6, #1
-.L1102:
+.L1126:
adds r4, r4, #1
- b .L1101
-.L1122:
+ b .L1125
+.L1146:
.align 2
-.L1121:
+.L1145:
.word .LANCHOR152
.word check_vpc_table
.word .LANCHOR159
- .word .LC25
+ .word .LC29
.word .LANCHOR42
- .word .LANCHOR47
+ .word .LANCHOR46
.word .LANCHOR48
.word .LANCHOR40
.word -1431655765
- .word .LC27
+ .word .LC31
.word .LC1
- .word .LC26
+ .word .LC30
.word .LANCHOR5
.size ftl_check_vpc, .-ftl_check_vpc
.section .text.ftl_scan_all_data,"ax",%progbits
@@ -8236,60 +8268,60 @@ ftl_scan_all_data:
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, r5, r6, r7, r8, lr}
movs r5, #0
- ldr r7, .L1137
+ ldr r7, .L1161
sub sp, sp, #32
movs r1, #0
- ldr r8, .L1137+24
- ldr r0, .L1137+4
+ ldr r8, .L1161+24
+ ldr r0, .L1161+4
bl printf
-.L1124:
+.L1148:
ldr r3, [r7]
cmp r5, r3
- bcc .L1130
+ bcc .L1154
add sp, sp, #32
@ sp needed
pop {r4, r5, r6, r7, r8, pc}
-.L1130:
+.L1154:
movs r2, #0
add r1, sp, #28
mov r0, r5
bl log2phys
ubfx r3, r5, #0, #11
- cbnz r3, .L1125
+ cbnz r3, .L1149
ldr r2, [sp, #28]
mov r1, r5
mov r0, r8
bl printf
-.L1125:
+.L1149:
ldr r3, [sp, #28]
adds r2, r3, #1
- beq .L1127
- ldr r4, .L1137+8
+ beq .L1151
+ ldr r4, .L1161+8
movs r2, #0
movs r1, #1
str r3, [r4, #4]
mov r0, r4
- ldr r3, .L1137+12
+ ldr r3, .L1161+12
str r5, [r4, #16]
str r2, [r4]
ldr r3, [r3]
str r3, [r4, #8]
- ldr r3, .L1137+16
+ ldr r3, .L1161+16
ldr r6, [r3]
str r6, [r4, #12]
bl FlashReadPages
ldr r3, [r4]
cmp r3, #256
- beq .L1128
+ beq .L1152
adds r3, r3, #1
- beq .L1128
+ beq .L1152
ldr r3, [r6, #8]
cmp r5, r3
- beq .L1127
-.L1128:
+ beq .L1151
+.L1152:
ldr r2, [r4, #8]
ldr r3, [r4, #12]
- ldr r0, .L1137+20
+ ldr r0, .L1161+20
ldr r1, [r2, #4]
str r1, [sp, #16]
mov r1, r5
@@ -8304,19 +8336,19 @@ ftl_scan_all_data:
ldr r2, [r4, #4]
ldr r3, [r3]
bl printf
-.L1127:
+.L1151:
adds r5, r5, #1
- b .L1124
-.L1138:
+ b .L1148
+.L1162:
.align 2
-.L1137:
+.L1161:
.word .LANCHOR152
- .word .LC28
+ .word .LC32
.word .LANCHOR138
.word .LANCHOR106
.word .LANCHOR114
- .word .LC30
- .word .LC29
+ .word .LC34
+ .word .LC33
.size ftl_scan_all_data, .-ftl_scan_all_data
.section .text.FtlGcScanTempBlk,"ax",%progbits
.align 1
@@ -8329,7 +8361,7 @@ ftl_scan_all_data:
FtlGcScanTempBlk:
@ args = 0, pretend = 0, frame = 48
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L1169
+ ldr r3, .L1195
movw r2, #65535
push {r4, r5, r6, r7, r8, r10, fp, lr}
sub sp, sp, #48
@@ -8337,29 +8369,29 @@ FtlGcScanTempBlk:
ldrh r5, [r3]
str r3, [sp, #20]
cmp r5, r2
- beq .L1161
- cbnz r5, .L1140
-.L1141:
+ beq .L1185
+ cbnz r5, .L1164
+.L1165:
bl FtlGcPageVarInit
- b .L1142
-.L1161:
+ b .L1166
+.L1185:
movs r5, #0
-.L1140:
- ldr r3, .L1169+4
+.L1164:
+ ldr r3, .L1195+4
ldrh r3, [r3]
cmp r3, r1
- beq .L1141
-.L1142:
- ldr fp, .L1169+52
-.L1143:
+ beq .L1165
+.L1166:
+ ldr fp, .L1195+56
+.L1182:
ldrh r2, [r4]
movs r3, #0
strb r3, [r4, #8]
movw r3, #65535
cmp r2, r3
- beq .L1144
-.L1160:
- ldr r3, .L1169+8
+ beq .L1167
+.L1184:
+ ldr r3, .L1195+8
movs r2, #0
ldr r0, [fp]
mov r10, r2
@@ -8367,38 +8399,38 @@ FtlGcScanTempBlk:
mov r8, #20
ldrh r3, [r3]
str r3, [sp, #8]
- ldr r3, .L1169+12
+ ldr r3, .L1195+12
ldr r3, [r3]
str r3, [sp, #12]
- ldr r3, .L1169+16
+ ldr r3, .L1195+16
ldrh r3, [r3]
str r3, [sp, #16]
- ldr r3, .L1169+20
+ ldr r3, .L1195+20
ldr r7, [r3]
- ldr r3, .L1169+24
+ ldr r3, .L1195+24
ldrh ip, [r3]
add r3, r4, #16
str r3, [sp, #4]
-.L1145:
+.L1168:
ldr r1, [sp, #8]
uxth r3, r2
cmp r1, r3
- bhi .L1147
+ bhi .L1170
mov r8, #0
movs r2, #0
mov r1, r10
bl FlashReadPages
-.L1148:
+.L1171:
uxth r3, r8
cmp r10, r3
- bhi .L1159
- ldr r3, .L1169+4
+ bhi .L1183
+ ldr r3, .L1195+4
adds r5, r5, #1
uxth r5, r5
ldrh r3, [r3]
cmp r3, r5
- bhi .L1160
-.L1144:
+ bhi .L1184
+.L1167:
ldr r2, [sp, #20]
movw r3, #65535
mov r0, r4
@@ -8412,12 +8444,12 @@ FtlGcScanTempBlk:
add sp, sp, #48
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1147:
+.L1170:
ldr r1, [sp, #4]
ldrh r3, [r1], #2
cmp r3, lr
str r1, [sp, #4]
- beq .L1146
+ beq .L1169
mla r1, r8, r10, r0
orr r3, r5, r3, lsl #10
str r3, [r1, #4]
@@ -8434,30 +8466,31 @@ FtlGcScanTempBlk:
str r3, [r1, #12]
add r3, r10, #1
uxth r10, r3
-.L1146:
+.L1169:
adds r2, r2, #1
- b .L1145
-.L1159:
+ b .L1168
+.L1183:
movs r3, #20
- ldr r1, [fp]
+ ldr r2, [fp]
mul r3, r3, r8
- adds r2, r1, r3
- ldr r6, [r1, r3]
- ldr r0, [r2, #4]
+ adds r1, r2, r3
+ ldr r6, [r2, r3]
+ ldr r0, [r1, #4]
+ ldr r7, [r1, #12]
str r0, [sp, #4]
- cbnz r6, .L1149
- ldr r7, [r2, #12]
- movw r2, #65535
+ cmp r6, #0
+ bne .L1172
ldrh r1, [r7]
+ movw r2, #65535
cmp r1, r2
- beq .L1149
- ldr r2, .L1169+28
+ beq .L1193
+ ldr r2, .L1195+28
ldr r0, [r7, #8]
ldr r2, [r2]
cmp r0, r2
- bls .L1151
-.L1149:
- ldr r3, .L1169+32
+ bls .L1174
+.L1193:
+ ldr r3, .L1195+32
movs r1, #0
ldrh r2, [r4]
movs r5, #0
@@ -8465,11 +8498,13 @@ FtlGcScanTempBlk:
strh r1, [r3, r2, lsl #1] @ movhi
ldrh r0, [r4]
bl INSERT_FREE_LIST
+ ldr r2, .L1195+36
movw r3, #65535
strh r3, [r4] @ movhi
+ strh r3, [r2] @ movhi
bl FtlGcPageVarInit
- b .L1143
-.L1151:
+ b .L1182
+.L1174:
mov r2, r6
add r1, sp, #24
str r3, [sp, #8]
@@ -8478,55 +8513,59 @@ FtlGcScanTempBlk:
ldr r1, [sp, #24]
ldr r3, [sp, #8]
cmp r2, r1
- beq .L1153
-.L1154:
+ beq .L1176
+.L1178:
ldr r2, [r7, #8]
- add r8, r8, #1
+.L1194:
ldr r1, [sp, #4]
+ add r8, r8, #1
ldr r0, [r7, #12]
bl FtlGcUpdatePage
- b .L1148
-.L1153:
+ b .L1171
+.L1176:
str r3, [sp, #8]
adds r3, r2, #1
- beq .L1154
+ beq .L1178
str r2, [sp, #32]
movs r1, #1
- ldr r2, .L1169+36
+ ldr r2, .L1195+40
add r0, sp, #28
ldr r2, [r2]
str r2, [sp, #36]
- ldr r2, .L1169+40
+ ldr r2, .L1195+44
ldr r2, [r2]
str r2, [sp, #40]
mov r2, r6
bl FlashReadPages
- ldr r2, .L1169+44
+ ldr r2, .L1195+48
ldr r1, [fp]
ldr r3, [sp, #8]
ldrh r2, [r2]
ldr r0, [sp, #36]
add ip, r3, r1
lsls r2, r2, #7
-.L1155:
+.L1179:
cmp r6, r2
- beq .L1154
+ beq .L1178
ldr r1, [ip, #8]
ldr r3, [r0, r6, lsl #2]
ldr r1, [r1, r6, lsl #2]
cmp r1, r3
- beq .L1156
+ beq .L1180
ldr r2, [sp, #32]
ldrh r1, [r4]
- ldr r0, .L1169+48
+ ldr r0, .L1195+52
bl printf
- b .L1149
-.L1156:
+ b .L1193
+.L1180:
adds r6, r6, #1
- b .L1155
-.L1170:
+ b .L1179
+.L1172:
+ mov r2, #-1
+ b .L1194
+.L1196:
.align 2
-.L1169:
+.L1195:
.word .LANCHOR160
.word .LANCHOR19
.word .LANCHOR3
@@ -8536,10 +8575,11 @@ FtlGcScanTempBlk:
.word .LANCHOR24
.word .LANCHOR152
.word .LANCHOR42
+ .word .LANCHOR145
.word .LANCHOR110
.word .LANCHOR115
.word .LANCHOR12
- .word .LC31
+ .word .LC35
.word .LANCHOR103
.size FtlGcScanTempBlk, .-FtlGcScanTempBlk
.section .text.FtlVendorPartWrite,"ax",%progbits
@@ -8553,7 +8593,7 @@ FtlGcScanTempBlk:
FtlVendorPartWrite:
@ args = 0, pretend = 0, frame = 104
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L1183
+ ldr r3, .L1209
push {r4, r5, r6, r7, r8, r10, fp, lr}
sub sp, sp, #104
str r2, [sp]
@@ -8562,26 +8602,26 @@ FtlVendorPartWrite:
mov r5, r1
ldrh r3, [r3]
cmp r2, r3
- bhi .L1179
- ldr r3, .L1183+4
+ bhi .L1205
+ ldr r3, .L1209+4
mov r8, #0
ldrh r6, [r3]
lsr r6, r0, r6
lsl fp, r6, #2
-.L1173:
- cbnz r5, .L1178
-.L1171:
+.L1199:
+ cbnz r5, .L1204
+.L1197:
mov r0, r8
add sp, sp, #104
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1178:
- ldr r3, .L1183+8
+.L1204:
+ ldr r3, .L1209+8
mov r0, r7
- ldr r10, .L1183+24
+ ldr r10, .L1209+24
ldr r3, [r3]
ldr r2, [r3, fp]
- ldr r3, .L1183+12
+ ldr r3, .L1209+12
str r2, [sp, #12]
ldrh r3, [r3]
mov r1, r3
@@ -8595,9 +8635,9 @@ FtlVendorPartWrite:
cmp r5, r4
it cc
uxthcc r4, r5
- cbz r2, .L1175
+ cbz r2, .L1201
cmp r4, r3
- beq .L1175
+ beq .L1201
ldr r3, [r10]
add r0, sp, #20
str r2, [sp, #24]
@@ -8607,7 +8647,7 @@ FtlVendorPartWrite:
add r3, sp, #40
str r3, [sp, #32]
bl FlashReadPages
-.L1176:
+.L1202:
lsls r3, r4, #9
ldr r0, [r10]
subs r5, r5, r4
@@ -8620,7 +8660,7 @@ FtlVendorPartWrite:
bl ftl_memcpy
ldr r2, [r10]
mov r1, r6
- ldr r0, .L1183+16
+ ldr r0, .L1209+16
adds r6, r6, #1
bl FtlMapWritePage
ldr r3, [sp]
@@ -8631,20 +8671,20 @@ FtlVendorPartWrite:
ldr r3, [sp, #8]
add r2, r2, r3
str r2, [sp]
- b .L1173
-.L1175:
- ldr r3, .L1183+20
+ b .L1199
+.L1201:
+ ldr r3, .L1209+20
movs r1, #0
ldr r0, [r10]
ldrh r2, [r3]
bl ftl_memset
- b .L1176
-.L1179:
+ b .L1202
+.L1205:
mov r8, #-1
- b .L1171
-.L1184:
+ b .L1197
+.L1210:
.align 2
-.L1183:
+.L1209:
.word .LANCHOR16
.word .LANCHOR22
.word .LANCHOR123
@@ -8665,57 +8705,57 @@ Ftl_save_ext_data:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
- ldr r2, .L1187
- ldr r3, .L1187+4
+ ldr r2, .L1213
+ ldr r3, .L1213+4
ldr r1, [r2]
cmp r1, r3
- bne .L1185
- ldr r3, .L1187+8
+ bne .L1211
+ ldr r3, .L1213+8
movs r1, #1
movs r0, #0
str r3, [r2, #4]
- ldr r3, .L1187+12
+ ldr r3, .L1213+12
ldr r3, [r3]
str r3, [r2, #88]
- ldr r3, .L1187+16
+ ldr r3, .L1213+16
ldr r3, [r3]
str r3, [r2, #92]
- ldr r3, .L1187+20
+ ldr r3, .L1213+20
ldr r3, [r3]
str r3, [r2, #8]
- ldr r3, .L1187+24
+ ldr r3, .L1213+24
ldr r3, [r3]
str r3, [r2, #12]
- ldr r3, .L1187+28
+ ldr r3, .L1213+28
ldr r3, [r3]
str r3, [r2, #16]
- ldr r3, .L1187+32
+ ldr r3, .L1213+32
ldr r3, [r3]
str r3, [r2, #20]
- ldr r3, .L1187+36
+ ldr r3, .L1213+36
ldr r3, [r3]
str r3, [r2, #28]
- ldr r3, .L1187+40
+ ldr r3, .L1213+40
ldr r3, [r3]
str r3, [r2, #32]
- ldr r3, .L1187+44
+ ldr r3, .L1213+44
ldr r3, [r3]
str r3, [r2, #36]
- ldr r3, .L1187+48
+ ldr r3, .L1213+48
ldr r3, [r3]
str r3, [r2, #40]
- ldr r3, .L1187+52
+ ldr r3, .L1213+52
ldr r3, [r3]
str r3, [r2, #44]
- ldr r3, .L1187+56
+ ldr r3, .L1213+56
ldr r3, [r3]
str r3, [r2, #48]
b FtlVendorPartWrite
-.L1185:
+.L1211:
bx lr
-.L1188:
+.L1214:
.align 2
-.L1187:
+.L1213:
.word .LANCHOR135
.word 1179929683
.word 1342177352
@@ -8743,7 +8783,7 @@ Ftl_save_ext_data:
FtlEctTblFlush:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r2, .L1194
+ ldr r2, .L1220
push {r3, lr}
ldrh r3, [r2]
cmp r3, #31
@@ -8752,22 +8792,22 @@ FtlEctTblFlush:
movhi r3, #32
strhls r3, [r2] @ movhi
movls r3, #1
- ldr r2, .L1194+4
- cbnz r0, .L1191
+ ldr r2, .L1220+4
+ cbnz r0, .L1217
ldr r1, [r2]
ldr r0, [r1, #20]
ldr r1, [r1, #16]
add r3, r3, r0
cmp r1, r3
- bcc .L1192
-.L1191:
+ bcc .L1218
+.L1217:
ldr r2, [r2]
movs r0, #64
ldr r3, [r2, #16]
str r3, [r2, #20]
- ldr r3, .L1194+8
+ ldr r3, .L1220+8
str r3, [r2]
- ldr r3, .L1194+12
+ ldr r3, .L1220+12
ldrh r1, [r3]
lsls r3, r1, #9
str r3, [r2, #12]
@@ -8778,12 +8818,12 @@ FtlEctTblFlush:
str r3, [r2, #4]
bl FtlVendorPartWrite
bl Ftl_save_ext_data
-.L1192:
+.L1218:
movs r0, #0
pop {r3, pc}
-.L1195:
+.L1221:
.align 2
-.L1194:
+.L1220:
.word .LANCHOR164
.word .LANCHOR118
.word 1112818501
@@ -8815,7 +8855,7 @@ sftl_vendor_write:
FtlVendorPartRead:
@ args = 0, pretend = 0, frame = 104
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L1207
+ ldr r3, .L1233
push {r4, r5, r6, r7, r8, r10, fp, lr}
mov r10, r2
adds r2, r0, r1
@@ -8824,28 +8864,28 @@ FtlVendorPartRead:
mov r6, r1
ldrh r3, [r3]
cmp r2, r3
- bhi .L1206
- ldr r3, .L1207+4
+ bhi .L1232
+ ldr r3, .L1233+4
mov r8, #0
- ldr fp, .L1207+28
+ ldr fp, .L1233+28
ldrh r5, [r3]
lsr r5, r0, r5
lsls r3, r5, #2
str r3, [sp]
-.L1199:
- cbnz r6, .L1205
-.L1197:
+.L1225:
+ cbnz r6, .L1231
+.L1223:
mov r0, r8
add sp, sp, #104
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1205:
- ldr r3, .L1207+8
+.L1231:
+ ldr r3, .L1233+8
mov r0, r7
ldr r2, [sp]
ldr r3, [r3]
ldr r3, [r3, r2]
- ldr r2, .L1207+12
+ ldr r2, .L1233+12
str r3, [sp, #8]
ldrh r4, [r2]
mov r1, r4
@@ -8860,7 +8900,7 @@ FtlVendorPartRead:
lsls r2, r4, #9
str r2, [sp, #8]
cmp r3, #0
- beq .L1201
+ beq .L1227
ldr r2, [fp]
add r0, sp, #20
str r3, [sp, #24]
@@ -8874,28 +8914,28 @@ FtlVendorPartRead:
ldr r2, [sp, #20]
ldr r3, [sp, #12]
adds r2, r2, #1
- ldr r2, .L1207+16
+ ldr r2, .L1233+16
it eq
moveq r8, #-1
ldr r2, [r2]
cmp r2, #256
- bne .L1203
+ bne .L1229
mov r2, r3
mov r1, r5
- ldr r0, .L1207+20
+ ldr r0, .L1233+20
bl printf
ldr r2, [fp]
mov r1, r5
- ldr r0, .L1207+24
+ ldr r0, .L1233+24
bl FtlMapWritePage
-.L1203:
+.L1229:
ldr r1, [fp]
lsls r2, r4, #9
ldr r3, [sp, #4]
mov r0, r10
add r1, r1, r3, lsl #9
bl ftl_memcpy
-.L1204:
+.L1230:
ldr r3, [sp, #8]
adds r5, r5, #1
subs r6, r6, r4
@@ -8904,25 +8944,25 @@ FtlVendorPartRead:
ldr r3, [sp]
adds r3, r3, #4
str r3, [sp]
- b .L1199
-.L1201:
+ b .L1225
+.L1227:
lsls r2, r4, #9
mov r1, r3
mov r0, r10
bl ftl_memset
- b .L1204
-.L1206:
+ b .L1230
+.L1232:
mov r8, #-1
- b .L1197
-.L1208:
+ b .L1223
+.L1234:
.align 2
-.L1207:
+.L1233:
.word .LANCHOR16
.word .LANCHOR22
.word .LANCHOR123
.word .LANCHOR12
.word .LANCHOR138
- .word .LC32
+ .word .LC36
.word .LANCHOR161
.word .LANCHOR108
.size FtlVendorPartRead, .-FtlVendorPartRead
@@ -8939,35 +8979,35 @@ FtlLoadEctTbl:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, lr}
movs r0, #64
- ldr r4, .L1211
- ldr r5, .L1211+4
+ ldr r4, .L1237
+ ldr r5, .L1237+4
ldr r2, [r4]
ldrh r1, [r5]
bl FtlVendorPartRead
ldr r3, [r4]
ldr r2, [r3]
- ldr r3, .L1211+8
+ ldr r3, .L1237+8
cmp r2, r3
- beq .L1210
- ldr r1, .L1211+12
- ldr r0, .L1211+16
+ beq .L1236
+ ldr r1, .L1237+12
+ ldr r0, .L1237+16
bl printf
ldrh r2, [r5]
movs r1, #0
ldr r0, [r4]
lsls r2, r2, #9
bl ftl_memset
-.L1210:
+.L1236:
movs r0, #0
pop {r3, r4, r5, pc}
-.L1212:
+.L1238:
.align 2
-.L1211:
+.L1237:
.word .LANCHOR118
.word .LANCHOR116
.word 1112818501
- .word .LC33
- .word .LC34
+ .word .LC37
+ .word .LC38
.size FtlLoadEctTbl, .-FtlLoadEctTbl
.section .text.Ftl_load_ext_data,"ax",%progbits
.align 1
@@ -8982,75 +9022,75 @@ Ftl_load_ext_data:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, lr}
movs r1, #1
- ldr r4, .L1216
+ ldr r4, .L1242
movs r0, #0
- ldr r5, .L1216+4
+ ldr r5, .L1242+4
mov r2, r4
bl FtlVendorPartRead
ldr r3, [r4]
cmp r3, r5
- beq .L1214
+ beq .L1240
mov r2, #512
movs r1, #0
mov r0, r4
bl ftl_memset
str r5, [r4]
-.L1214:
+.L1240:
ldr r3, [r4]
cmp r3, r5
- ldr r3, .L1216+8
- bne .L1215
+ ldr r3, .L1242+8
+ bne .L1241
ldr r1, [r4, #88]
- ldr r2, .L1216+12
+ ldr r2, .L1242+12
str r1, [r2]
ldr r1, [r4, #92]
- ldr r2, .L1216+16
+ ldr r2, .L1242+16
str r1, [r2]
ldr r1, [r4, #8]
- ldr r2, .L1216+20
+ ldr r2, .L1242+20
str r1, [r2]
ldr r1, [r4, #12]
- ldr r2, .L1216+24
+ ldr r2, .L1242+24
str r1, [r2]
ldr r1, [r4, #16]
- ldr r2, .L1216+28
+ ldr r2, .L1242+28
str r1, [r2]
ldr r1, [r4, #20]
- ldr r2, .L1216+32
+ ldr r2, .L1242+32
str r1, [r2]
ldr r2, [r4, #28]
ldr r1, [r4, #32]
str r2, [r3]
- ldr r2, .L1216+36
+ ldr r2, .L1242+36
str r1, [r2]
ldr r1, [r4, #36]
- ldr r2, .L1216+40
+ ldr r2, .L1242+40
str r1, [r2]
ldr r1, [r4, #40]
- ldr r2, .L1216+44
+ ldr r2, .L1242+44
str r1, [r2]
ldr r1, [r4, #44]
- ldr r2, .L1216+48
+ ldr r2, .L1242+48
str r1, [r2]
ldr r1, [r4, #48]
- ldr r2, .L1216+52
+ ldr r2, .L1242+52
str r1, [r2]
-.L1215:
- ldr r1, .L1216+56
- ldr r2, .L1216+60
+.L1241:
+ ldr r1, .L1242+56
+ ldr r2, .L1242+60
ldr r3, [r3]
ldr r0, [r1]
ldrh r2, [r2]
- ldr r1, .L1216+64
+ ldr r1, .L1242+64
mla r0, r0, r2, r3
ldrh r1, [r1]
bl __aeabi_uidiv
- ldr r3, .L1216+68
+ ldr r3, .L1242+68
str r0, [r3]
pop {r3, r4, r5, pc}
-.L1217:
+.L1243:
.align 2
-.L1216:
+.L1242:
.word .LANCHOR135
.word 1179929683
.word .LANCHOR91
@@ -9068,7 +9108,7 @@ Ftl_load_ext_data:
.word .LANCHOR90
.word .LANCHOR14
.word .LANCHOR5
- .word .LANCHOR145
+ .word .LANCHOR143
.size Ftl_load_ext_data, .-Ftl_load_ext_data
.section .text.sftl_vendor_read,"ax",%progbits
.align 1
@@ -9100,30 +9140,30 @@ FtlMapBlkWriteDump_data:
mov r4, r0
ldr r3, [r0, #36]
cmp r3, #0
- beq .L1219
+ beq .L1245
movs r3, #0
- ldr r5, .L1231
+ ldr r5, .L1257
str r3, [r0, #36]
- ldr r3, .L1231+4
+ ldr r3, .L1257+4
ldrh r6, [r0, #6]
mov r7, r5
ldr r10, [r0, #24]
ldr r3, [r3]
str r3, [r5, #8]
- ldr r3, .L1231+8
+ ldr r3, .L1257+8
ldr r8, [r3]
ldrh r3, [r0, #2]
str r8, [r5, #12]
- cbz r3, .L1221
- ldr r2, .L1231+12
+ cbz r3, .L1247
+ ldr r2, .L1257+12
ldrh r2, [r2]
subs r2, r2, #1
cmp r3, r2
- bge .L1221
+ bge .L1247
ldrh r2, [r0]
movw r1, #65535
cmp r2, r1
- beq .L1221
+ beq .L1247
ldr r1, [r0, #12]
subs r3, r3, #1
mov r0, r5
@@ -9135,44 +9175,44 @@ FtlMapBlkWriteDump_data:
bl FlashReadPages
ldr r3, [r5]
adds r3, r3, #1
- beq .L1221
+ beq .L1247
ldr r3, [r4, #24]
ldrh r1, [r8, #8]
ldr r2, [r3, r1, lsl #2]
ldr r3, [r5, #4]
cmp r2, r3
- bne .L1221
+ bne .L1247
ldr r2, [r5, #8]
-.L1230:
+.L1256:
mov r0, r4
pop {r3, r4, r5, r6, r7, r8, r10, lr}
b FtlMapWritePage
-.L1221:
+.L1247:
subs r6, r6, #1
uxth r6, r6
ldr r3, [r10, r6, lsl #2]
str r3, [r7, #4]
- cbz r3, .L1222
+ cbz r3, .L1248
movs r2, #1
- ldr r0, .L1231
+ ldr r0, .L1257
mov r1, r2
bl FlashReadPages
-.L1223:
+.L1249:
ldr r2, [r7, #8]
mov r1, r6
- b .L1230
-.L1222:
- ldr r3, .L1231+16
+ b .L1256
+.L1248:
+ ldr r3, .L1257+16
movs r1, #255
ldr r0, [r7, #8]
ldrh r2, [r3]
bl ftl_memset
- b .L1223
-.L1219:
+ b .L1249
+.L1245:
pop {r3, r4, r5, r6, r7, r8, r10, pc}
-.L1232:
+.L1258:
.align 2
-.L1231:
+.L1257:
.word .LANCHOR138
.word .LANCHOR107
.word .LANCHOR114
@@ -9192,10 +9232,10 @@ FtlVpcTblFlush:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r4, r5, r6, r7, r8, r10, fp, lr}
mov r10, #0
- ldr r5, .L1248
- ldr r3, .L1248+4
- ldr fp, .L1248+76
- ldr r6, .L1248+8
+ ldr r5, .L1274
+ ldr r3, .L1274+4
+ ldr fp, .L1274+76
+ ldr r6, .L1274+8
ldr r7, [r3]
ldr r0, [fp]
ldrh r3, [r5]
@@ -9203,23 +9243,23 @@ FtlVpcTblFlush:
str r0, [r6, #8]
strh r3, [r7, #2] @ movhi
movw r3, #61604
- ldr r4, .L1248+12
+ ldr r4, .L1274+12
strh r3, [r7] @ movhi
- ldr r2, .L1248+16
+ ldr r2, .L1274+16
ldr r3, [r5, #8]
- ldr ip, .L1248+80
+ ldr ip, .L1274+80
str r10, [r7, #8]
str r3, [r7, #4]
stm r4, {r2, ip}
ldrh r2, [r5, #6]
str r10, [r7, #12]
- ldr r8, .L1248+84
+ ldr r8, .L1274+84
strh r2, [r4, #8] @ movhi
- ldr r2, .L1248+20
- ldr r3, .L1248+24
+ ldr r2, .L1274+20
+ ldr r3, .L1274+24
ldrh r2, [r2]
strb r2, [r4, #10]
- ldr r2, .L1248+28
+ ldr r2, .L1274+28
ldrh r1, [r2]
ldrh ip, [r2, #2]
strh r1, [r4, #14] @ movhi
@@ -9227,7 +9267,7 @@ FtlVpcTblFlush:
ldrb r2, [r2, #8] @ zero_extendqisi2
strb r2, [r4, #11]
orr r1, r1, ip, lsl #6
- ldr r2, .L1248+32
+ ldr r2, .L1274+32
strh r1, [r4, #16] @ movhi
ldrh r1, [r2]
ldrh ip, [r2, #2]
@@ -9236,7 +9276,7 @@ FtlVpcTblFlush:
ldrb r2, [r2, #8] @ zero_extendqisi2
strb r2, [r4, #12]
orr r1, r1, ip, lsl #6
- ldr r2, .L1248+36
+ ldr r2, .L1274+36
strh r1, [r4, #20] @ movhi
ldrh r1, [r2]
ldrh ip, [r2, #2]
@@ -9245,32 +9285,32 @@ FtlVpcTblFlush:
ldrb r2, [r2, #8] @ zero_extendqisi2
strb r2, [r4, #13]
orr r1, r1, ip, lsl #6
- ldr r2, .L1248+40
+ ldr r2, .L1274+40
strh r1, [r4, #24] @ movhi
movs r1, #255
ldr r2, [r2]
str r2, [r4, #32]
ldr r2, [r8]
str r2, [r4, #40]
- ldr r2, .L1248+44
+ ldr r2, .L1274+44
ldr r2, [r2]
str r2, [r4, #36]
ldrh r2, [r3]
bl ftl_memset
mov r1, r4
- ldr r4, .L1248+48
+ ldr r4, .L1274+48
movs r2, #48
ldr r0, [r6, #8]
bl ftl_memcpy
ldrh r2, [r4]
ldr r0, [r6, #8]
- ldr r1, .L1248+52
+ ldr r1, .L1274+52
lsls r2, r2, #1
adds r0, r0, #48
ldr r1, [r1]
bl ftl_memcpy
ldrh r0, [r4]
- ldr r1, .L1248+56
+ ldr r1, .L1274+56
ldr r4, [r6, #8]
lsrs r2, r0, #3
adds r0, r0, #24
@@ -9282,13 +9322,13 @@ FtlVpcTblFlush:
mov r4, r10
bl ftl_memcpy
mov r0, r10
- ldr r10, .L1248+4
+ ldr r10, .L1274+4
bl FtlUpdateVaildLpn
movw r3, #65535
str r3, [sp]
- ldr r3, .L1248+24
+ ldr r3, .L1274+24
str r3, [sp, #4]
-.L1234:
+.L1260:
ldr r3, [fp]
ldrh r1, [r5, #2]
ldrh r2, [r5]
@@ -9297,11 +9337,11 @@ FtlVpcTblFlush:
str r3, [r6, #12]
orr r3, r1, r2, lsl #10
str r3, [r6, #4]
- ldr r3, .L1248+60
+ ldr r3, .L1274+60
ldrh r3, [r3]
subs r3, r3, #1
cmp r1, r3
- blt .L1235
+ blt .L1261
ldrh r3, [r5, #4]
strh r2, [r5, #4] @ movhi
str r3, [sp]
@@ -9317,7 +9357,7 @@ FtlVpcTblFlush:
str r2, [r6, #4]
str r3, [r7, #4]
strh r0, [r7, #2] @ movhi
-.L1235:
+.L1261:
ldr r3, [sp, #4]
ldr r0, [fp]
ldrh r1, [r3]
@@ -9326,7 +9366,7 @@ FtlVpcTblFlush:
str r0, [r7, #12]
mov r2, r3
mov r1, r3
- ldr r0, .L1248+8
+ ldr r0, .L1274+8
bl FlashProgPages
ldrh r3, [r5, #2]
ldr r2, [r6]
@@ -9334,51 +9374,51 @@ FtlVpcTblFlush:
uxth r3, r3
adds r1, r2, #1
strh r3, [r5, #2] @ movhi
- bne .L1236
+ bne .L1262
cmp r3, #1
- bne .L1237
+ bne .L1263
movw r2, #1138
- ldr r1, .L1248+64
- ldr r0, .L1248+68
+ ldr r1, .L1274+64
+ ldr r0, .L1274+68
bl printf
-.L1237:
+.L1263:
ldrh r3, [r5, #2]
adds r4, r4, #1
uxth r4, r4
cmp r3, #1
itttt eq
- ldreq r3, .L1248+60
+ ldreq r3, .L1274+60
ldrheq r3, [r3]
addeq r3, r3, #-1
strheq r3, [r5, #2] @ movhi
cmp r4, #3
- bls .L1234
+ bls .L1260
mov r2, r4
ldr r1, [r6, #4]
- ldr r0, .L1248+72
+ ldr r0, .L1274+72
bl printf
-.L1240:
- b .L1240
-.L1236:
+.L1266:
+ b .L1266
+.L1262:
cmp r3, #1
- beq .L1234
+ beq .L1260
cmp r2, #256
- beq .L1234
+ beq .L1260
ldr r2, [sp]
movw r3, #65535
cmp r2, r3
- beq .L1241
+ beq .L1267
movs r1, #1
mov r0, r2
bl FtlFreeSysBlkQueueIn
-.L1241:
+.L1267:
movs r0, #0
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1249:
+.L1275:
.align 2
-.L1248:
+.L1274:
.word .LANCHOR139
.word .LANCHOR114
.word .LANCHOR138
@@ -9397,7 +9437,7 @@ FtlVpcTblFlush:
.word .LANCHOR20
.word .LANCHOR165
.word .LC1
- .word .LC35
+ .word .LC39
.word .LANCHOR106
.word 1342177352
.word .LANCHOR82
@@ -9433,17 +9473,17 @@ sftl_deinit:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, lr}
- ldr r3, .L1253
+ ldr r3, .L1279
ldr r3, [r3]
cmp r3, #1
- bne .L1252
+ bne .L1278
bl FtlSysFlush
-.L1252:
+.L1278:
movs r0, #0
pop {r3, pc}
-.L1254:
+.L1280:
.align 2
-.L1253:
+.L1279:
.word .LANCHOR166
.size sftl_deinit, .-sftl_deinit
.section .text.FtlDiscard,"ax",%progbits
@@ -9457,24 +9497,24 @@ sftl_deinit:
FtlDiscard:
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L1270
+ ldr r3, .L1296
adds r2, r0, r1
push {r0, r1, r4, r5, r6, r7, r8, lr}
mov r7, r0
mov r5, r1
ldr r3, [r3]
cmp r2, r3
- bhi .L1263
+ bhi .L1289
cmp r1, #31
- bhi .L1257
-.L1262:
+ bhi .L1283
+.L1288:
movs r0, #0
-.L1255:
+.L1281:
add sp, sp, #8
@ sp needed
pop {r4, r5, r6, r7, r8, pc}
-.L1257:
- ldr r8, .L1270+12
+.L1283:
+ ldr r8, .L1296+12
ldrh r4, [r8]
mov r1, r4
bl __aeabi_uidiv
@@ -9482,7 +9522,7 @@ FtlDiscard:
mov r6, r0
subs r7, r7, r3
uxth r7, r7
- cbz r7, .L1258
+ cbz r7, .L1284
subs r4, r4, r7
adds r6, r6, #1
cmp r4, r5
@@ -9490,32 +9530,32 @@ FtlDiscard:
movcs r4, r5
uxth r4, r4
subs r5, r5, r4
-.L1258:
- ldr r4, .L1270+4
+.L1284:
+ ldr r4, .L1296+4
mov r3, #-1
- ldr r7, .L1270+8
+ ldr r7, .L1296+8
str r3, [sp, #4]
-.L1259:
+.L1285:
ldrh r3, [r8]
cmp r5, r3
- bcs .L1261
- ldr r3, .L1270+4
+ bcs .L1287
+ ldr r3, .L1296+4
ldr r2, [r3]
cmp r2, #32
- bls .L1262
+ bls .L1288
movs r4, #0
str r4, [r3]
bl l2p_flush
bl FtlVpcTblFlush
- b .L1262
-.L1261:
+ b .L1288
+.L1287:
movs r2, #0
mov r1, sp
mov r0, r6
bl log2phys
ldr r3, [sp]
adds r3, r3, #1
- beq .L1260
+ beq .L1286
ldr r3, [r4]
movs r2, #1
add r1, sp, #4
@@ -9530,17 +9570,17 @@ FtlDiscard:
ubfx r0, r0, #10, #16
bl P2V_block_in_plane
bl decrement_vpc_count
-.L1260:
+.L1286:
ldrh r3, [r8]
adds r6, r6, #1
subs r5, r5, r3
- b .L1259
-.L1263:
+ b .L1285
+.L1289:
mov r0, #-1
- b .L1255
-.L1271:
+ b .L1281
+.L1297:
.align 2
-.L1270:
+.L1296:
.word .LANCHOR34
.word .LANCHOR167
.word .LANCHOR86
@@ -9557,47 +9597,47 @@ FtlDiscard:
allocate_new_data_superblock:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L1282
+ ldr r3, .L1308
push {r4, r5, r6, lr}
mov r6, r0
ldrh r4, [r0]
ldrh r3, [r3]
cmp r3, r4
- bcs .L1273
- movw r2, #2760
- ldr r1, .L1282+4
- ldr r0, .L1282+8
+ bcs .L1299
+ movw r2, #2755
+ ldr r1, .L1308+4
+ ldr r0, .L1308+8
bl printf
-.L1273:
+.L1299:
movw r3, #65535
cmp r4, r3
- beq .L1274
- ldr r3, .L1282+12
+ beq .L1300
+ ldr r3, .L1308+12
mov r0, r4
ldr r3, [r3]
ldrh r3, [r3, r4, lsl #1]
- cbz r3, .L1275
+ cbz r3, .L1301
bl INSERT_DATA_LIST
-.L1274:
- ldr r5, .L1282+16
+.L1300:
+ ldr r5, .L1308+16
movw r2, #65535
movs r3, #1
strb r3, [r6, #8]
ldrh r0, [r5]
cmp r0, r2
- beq .L1276
+ beq .L1302
cmp r4, r0
- bne .L1277
- ldr r3, .L1282+12
+ bne .L1303
+ ldr r3, .L1308+12
ldr r3, [r3]
ldrh r3, [r3, r0, lsl #1]
- cbz r3, .L1278
-.L1277:
+ cbz r3, .L1304
+.L1303:
bl update_vpc_list
-.L1278:
+.L1304:
movw r3, #65535
strh r3, [r5] @ movhi
-.L1276:
+.L1302:
mov r0, r6
bl allocate_data_superblock
bl l2p_flush
@@ -9606,12 +9646,12 @@ allocate_new_data_superblock:
bl FtlVpcTblFlush
movs r0, #0
pop {r4, r5, r6, pc}
-.L1275:
+.L1301:
bl INSERT_FREE_LIST
- b .L1274
-.L1283:
+ b .L1300
+.L1309:
.align 2
-.L1282:
+.L1308:
.word .LANCHOR5
.word .LANCHOR168
.word .LC1
@@ -9627,125 +9667,109 @@ allocate_new_data_superblock:
.fpu softvfp
.type FtlProgPages, %function
FtlProgPages:
- @ args = 0, pretend = 0, frame = 8
+ @ args = 0, pretend = 0, frame = 16
@ frame_needed = 0, uses_anonymous_args = 0
- push {r0, r1, r4, r5, r6, r7, r8, r10, fp, lr}
+ push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r10, fp, lr}
movs r6, #0
- ldr r8, .L1298+24
- mov r4, r3
+ ldr r10, .L1329+20
+ mov r5, r3
movs r2, #0
- mov r5, r0
+ mov r4, r0
+ ldr fp, .L1329
+ mov r8, r1
ldrb r3, [r3, #9] @ zero_extendqisi2
- mov r10, r1
bl FlashProgPages
-.L1285:
- cmp r6, r10
- beq .L1292
- ldr r7, .L1298
- b .L1293
-.L1288:
- ldr r0, [r5, #4]
+.L1311:
+ cmp r6, r8
+ bne .L1318
+ ldr r3, .L1329
+ ldrb r2, [r5, #6] @ zero_extendqisi2
+ ldrh r3, [r3]
+ cmp r2, r3
+ bcc .L1310
+ movw r2, #997
+ ldr r1, .L1329+4
+ ldr r0, .L1329+8
+ bl printf
+.L1310:
+ add sp, sp, #16
+ @ sp needed
+ pop {r4, r5, r6, r7, r8, r10, fp, pc}
+.L1313:
+ ldr r1, [r4, #4]
+ mov r0, r10
+ bl printf
+ ldr r0, [r4, #4]
ubfx r0, r0, #10, #16
bl P2V_block_in_plane
- ldrh r3, [r4]
- cmp r3, r0
- bne .L1286
- ldr r1, [r8]
- ldrh r0, [r4, #4]
- ldrh r2, [r1, r3, lsl #1]
- subs r2, r2, r0
- strh r2, [r1, r3, lsl #1] @ movhi
- ldrh r3, [r7]
- strh r3, [r4, #2] @ movhi
- movs r3, #0
- strb r3, [r4, #6]
- strh r3, [r4, #4] @ movhi
-.L1286:
- ldrh r3, [r4, #4]
- cbnz r3, .L1287
- mov r0, r4
+ bl decrement_vpc_count
+ ldrh r3, [r5, #4]
+ cbnz r3, .L1312
+ mov r0, r5
bl allocate_new_data_superblock
-.L1287:
- ldr r2, .L1298+4
- ldr r3, [r2, #96]
- adds r3, r3, #1
- str r3, [r2, #96]
- ldr r0, [r5, #4]
- ubfx r0, r0, #10, #16
- bl FtlGcMarkBadPhyBlk
- mov r0, r4
+.L1312:
+ mov r0, r5
bl get_new_active_ppa
movs r2, #0
- str r0, [r5, #4]
- str r0, [sp, #4]
+ str r0, [r4, #4]
+ str r0, [sp, #12]
movs r1, #1
- ldrb r3, [r4, #9] @ zero_extendqisi2
- mov r0, r5
+ ldrb r3, [r5, #9] @ zero_extendqisi2
+ mov r0, r4
bl FlashProgPages
-.L1293:
- ldr r3, [r5]
- adds r3, r3, #1
- beq .L1288
- ldr r3, .L1298+8
- ldrb r2, [r4, #6] @ zero_extendqisi2
- ldrh r3, [r3]
+.L1318:
+ ldr r2, [r4]
+ adds r3, r2, #1
+ beq .L1313
+ cmp r2, #256
+ beq .L1313
+ ldrb r2, [r5, #6] @ zero_extendqisi2
+ ldrh r3, [fp]
cmp r2, r3
- bcc .L1289
- mov r2, #960
- ldr r1, .L1298+12
- ldr r0, .L1298+16
+ bcc .L1314
+ movw r2, #982
+ ldr r1, .L1329+4
+ ldr r0, .L1329+8
bl printf
-.L1289:
- ldr r3, [r5, #4]
- add r1, sp, #8
+.L1314:
+ ldr r3, [r4, #4]
+ add r1, sp, #16
movs r2, #1
- ldr r0, [r5, #16]
+ ldr r0, [r4, #16]
str r3, [r1, #-4]!
bl log2phys
- ldr r3, [r5, #12]
- ldr fp, [r3, #12]
- ubfx r0, fp, #10, #16
+ ldr r3, [r4, #12]
+ ldr r3, [r3, #12]
+ ubfx r0, r3, #10, #16
+ str r3, [sp, #4]
bl P2V_block_in_plane
- cmp fp, #-1
+ ldr r3, [sp, #4]
mov r7, r0
- beq .L1290
- ldr r3, [r8]
+ adds r3, r3, #1
+ beq .L1315
+ ldr r3, .L1329+12
+ ldr r3, [r3]
ldrh r2, [r3, r0, lsl #1]
- cbnz r2, .L1291
+ cbnz r2, .L1316
mov r1, r0
- ldr r0, .L1298+20
+ ldr r0, .L1329+16
bl printf
-.L1291:
+.L1316:
mov r0, r7
bl decrement_vpc_count
-.L1290:
+.L1315:
adds r6, r6, #1
- adds r5, r5, #20
- b .L1285
-.L1292:
- ldr r3, .L1298+8
- ldrb r2, [r4, #6] @ zero_extendqisi2
- ldrh r3, [r3]
- cmp r2, r3
- bcc .L1284
- movw r2, #975
- ldr r1, .L1298+12
- ldr r0, .L1298+16
- bl printf
-.L1284:
- add sp, sp, #8
- @ sp needed
- pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1299:
+ adds r4, r4, #20
+ b .L1311
+.L1330:
.align 2
-.L1298:
- .word .LANCHOR19
- .word .LANCHOR135
+.L1329:
.word .LANCHOR3
.word .LANCHOR169
.word .LC1
- .word .LC36
.word .LANCHOR42
+ .word .LC41
+ .word .LC40
.size FtlProgPages, .-FtlProgPages
.section .text.FtlGcFreeTempBlock,"ax",%progbits
.align 1
@@ -9760,183 +9784,148 @@ FtlGcFreeTempBlock:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r10, fp, lr}
movw r3, #65535
- ldr r0, .L1319
- ldr r5, .L1319+4
- ldrh r6, [r0]
- mov r4, r0
- cmp r6, r3
- beq .L1301
- ldr r3, .L1319+8
+ ldr r4, .L1346
+ ldrh r2, [r4]
+ cmp r2, r3
+ beq .L1332
+ ldr r3, .L1346+4
+ mov r0, r4
ldrh r1, [r3]
bl FtlGcScanTempBlk
str r0, [sp, #12]
- adds r0, r0, #1
- beq .L1301
- ldr r3, .L1319+12
- ldr r2, [r3]
- ldrh r3, [r2, r6, lsl #1]
- cmp r3, #4
- bls .L1302
- subs r3, r3, #5
- movs r0, #1
- strh r3, [r2, r6, lsl #1] @ movhi
- bl FtlEctTblFlush
-.L1302:
- ldr r3, [r5]
- cbnz r3, .L1303
- ldr r2, .L1319+16
- ldr r0, [sp, #12]
- ldr r3, [r2, #96]
- ubfx r0, r0, #10, #16
- adds r3, r3, #1
- str r3, [r2, #96]
- bl FtlBbmMapBadBlock
- bl FtlBbmTblFlush
-.L1303:
- movs r0, #1
- movs r3, #0
- str r3, [r5]
-.L1300:
- add sp, sp, #16
- @ sp needed
- pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1301:
- ldrh r2, [r4]
- movs r3, #0
- str r3, [r5]
+.L1332:
+ ldr r3, .L1346+8
+ movs r2, #0
+ str r2, [r3]
movw r3, #65535
+ ldrh r2, [r4]
cmp r2, r3
- bne .L1305
-.L1314:
- movs r0, #0
- b .L1300
-.L1305:
- ldr r6, .L1319+8
+ beq .L1334
+ ldr r6, .L1346+4
ldrb r0, [r4, #7] @ zero_extendqisi2
- ldr r5, .L1319+20
+ ldr r5, .L1346+12
ldrh r2, [r6]
ldrh r1, [r5]
muls r2, r0, r2
cmp r1, r2
- beq .L1306
- movs r2, #162
- ldr r1, .L1319+24
- ldr r0, .L1319+28
+ beq .L1335
+ movs r2, #164
+ ldr r1, .L1346+16
+ ldr r0, .L1346+20
bl printf
-.L1306:
+.L1335:
ldrh r6, [r6]
ldrb r3, [r4, #7] @ zero_extendqisi2
- ldr r2, .L1319+32
+ ldr r2, .L1346+24
ldrh r0, [r4]
- ldr fp, .L1319+64
+ ldr fp, .L1346+56
smulbb r3, r3, r6
ldr r1, [r2]
movs r6, #0
- str r2, [sp, #4]
+ mov r10, r2
strh r3, [r1, r0, lsl #1] @ movhi
- ldr r1, .L1319+36
+ ldr r1, .L1346+28
ldrh r3, [r5]
ldr r0, [r1]
add r3, r3, r0
str r3, [r1]
-.L1307:
+.L1336:
ldrh r2, [r5]
uxth r3, r6
cmp r2, r3
- bhi .L1311
+ bhi .L1340
movw r0, #65535
bl decrement_vpc_count
- ldr r3, [sp, #4]
ldrh r0, [r4]
- ldr r3, [r3]
+ ldr r3, [r10]
ldrh r3, [r3, r0, lsl #1]
cmp r3, #0
- beq .L1312
+ beq .L1341
bl INSERT_DATA_LIST
-.L1313:
- ldr r3, .L1319+40
+.L1342:
+ ldr r2, .L1346+32
+ movs r3, #0
movw r6, #65535
+ strh r3, [r5] @ movhi
strh r6, [r4] @ movhi
- movs r4, #0
- strh r4, [r5] @ movhi
- strh r4, [r3] @ movhi
+ strh r3, [r2] @ movhi
bl l2p_flush
bl FtlVpcTblFlush
- ldr r3, .L1319+44
+ ldr r3, .L1346+36
strh r6, [r3] @ movhi
- ldr r3, .L1319+48
+ ldr r3, .L1346+40
ldrh r2, [r3]
- ldr r3, .L1319+52
+ ldr r3, .L1346+44
ldrh r3, [r3]
add r3, r3, r3, lsl #1
cmp r2, r3, asr #2
- ble .L1314
- ldr r3, .L1319+56
- movs r2, #20
- mov r0, r4
- strh r2, [r3] @ movhi
- b .L1300
-.L1311:
+ ittt gt
+ ldrgt r3, .L1346+48
+ movgt r2, #20
+ strhgt r2, [r3] @ movhi
+.L1334:
+ movs r0, #0
+ add sp, sp, #16
+ @ sp needed
+ pop {r4, r5, r6, r7, r8, r10, fp, pc}
+.L1340:
uxth r3, r6
- movs r7, #12
+ mov r8, #12
ldr r2, [fp]
- muls r7, r3, r7
- ldr r3, .L1319+60
- ldr r8, [r3]
- add r10, r8, r7
- ldr r1, [r10, #8]
- cmp r1, r2
- bcc .L1308
- movs r2, #168
- ldr r1, .L1319+24
- ldr r0, .L1319+28
- bl printf
-.L1308:
+ mul r8, r8, r3
+ ldr r3, .L1346+52
+ ldr r3, [r3]
+ add r7, r3, r8
+ ldr r0, [r7, #8]
+ cmp r0, r2
+ bcc .L1337
+.L1344:
+ ldrh r0, [r4]
+ b .L1345
+.L1337:
movs r2, #0
add r1, sp, #12
- ldr r0, [r10, #8]
+ str r3, [sp, #4]
bl log2phys
+ ldr r3, [sp, #4]
ldr r2, [sp, #12]
- ldr r0, [r8, r7]
+ ldr r0, [r3, r8]
cmp r0, r2
- bne .L1309
+ bne .L1339
ubfx r0, r0, #10, #16
bl P2V_block_in_plane
movs r2, #1
- mov r7, r0
- add r1, r10, #4
- ldr r0, [r10, #8]
+ mov r8, r0
+ adds r1, r7, #4
+ ldr r0, [r7, #8]
bl log2phys
- mov r0, r7
-.L1318:
+ mov r0, r8
+.L1345:
bl decrement_vpc_count
-.L1310:
- adds r6, r6, #1
- b .L1307
-.L1309:
- ldr r3, [r10, #4]
+ b .L1338
+.L1339:
+ ldr r3, [r7, #4]
cmp r2, r3
- beq .L1310
- ldrh r0, [r4]
- b .L1318
-.L1312:
+ bne .L1344
+.L1338:
+ adds r6, r6, #1
+ b .L1336
+.L1341:
bl INSERT_FREE_LIST
- b .L1313
-.L1320:
+ b .L1342
+.L1347:
.align 2
-.L1319:
+.L1346:
.word .LANCHOR53
- .word .LANCHOR133
.word .LANCHOR19
- .word .LANCHOR43
- .word .LANCHOR135
+ .word .LANCHOR133
.word .LANCHOR70
.word .LANCHOR170
.word .LC1
.word .LANCHOR42
.word .LANCHOR84
.word .LANCHOR69
- .word .LANCHOR144
+ .word .LANCHOR145
.word .LANCHOR48
.word .LANCHOR171
.word .LANCHOR100
@@ -9955,27 +9944,27 @@ FtlGcPageRecovery:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, lr}
- ldr r4, .L1323
- ldr r5, .L1323+4
+ ldr r4, .L1350
+ ldr r5, .L1350+4
ldrh r1, [r4]
mov r0, r5
bl FtlGcScanTempBlk
ldrh r2, [r5, #2]
ldrh r3, [r4]
cmp r2, r3
- bcc .L1321
- ldr r0, .L1323+8
+ bcc .L1348
+ ldr r0, .L1350+8
bl FtlMapBlkWriteDump_data
movs r0, #0
bl FtlGcFreeTempBlock
- ldr r3, .L1323+12
+ ldr r3, .L1350+12
movs r2, #0
str r2, [r3]
-.L1321:
+.L1348:
pop {r3, r4, r5, pc}
-.L1324:
+.L1351:
.align 2
-.L1323:
+.L1350:
.word .LANCHOR19
.word .LANCHOR53
.word .LANCHOR129
@@ -9994,13 +9983,13 @@ FtlPowerLostRecovery:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, lr}
movs r4, #0
- ldr r5, .L1326
- ldr r3, .L1326+4
+ ldr r5, .L1353
+ ldr r3, .L1353+4
mov r0, r5
str r4, [r3]
bl FtlRecoverySuperblock
mov r0, r5
- ldr r5, .L1326+8
+ ldr r5, .L1353+8
bl FtlSlcSuperblockCheck
mov r0, r5
bl FtlRecoverySuperblock
@@ -10011,9 +10000,9 @@ FtlPowerLostRecovery:
bl decrement_vpc_count
mov r0, r4
pop {r3, r4, r5, pc}
-.L1327:
+.L1354:
.align 2
-.L1326:
+.L1353:
.word .LANCHOR51
.word .LANCHOR157
.word .LANCHOR52
@@ -10031,72 +10020,51 @@ Ftl_gc_temp_data_write_back:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, r6, r7, lr}
movs r3, #0
- ldr r4, .L1335
+ ldr r4, .L1363
movs r6, #0
movs r7, #20
mov r2, r3
- ldr r5, .L1335+4
+ ldr r5, .L1363+4
ldr r1, [r4]
ldr r0, [r5]
bl FlashProgPages
-.L1329:
+.L1356:
ldr r1, [r4]
uxth r3, r6
cmp r1, r3
- bhi .L1332
+ bhi .L1359
ldr r0, [r5]
bl FtlGcBufFree
- ldr r3, .L1335+8
+ ldr r3, .L1363+8
movs r0, #0
str r0, [r4]
ldrh r3, [r3, #4]
- cbnz r3, .L1328
+ cbnz r3, .L1355
movs r0, #1
bl FtlGcFreeTempBlock
- b .L1334
-.L1332:
+ movs r0, #1
+.L1355:
+ pop {r3, r4, r5, r6, r7, pc}
+.L1359:
muls r3, r7, r3
ldr r2, [r5]
adds r6, r6, #1
adds r1, r2, r3
ldr r2, [r2, r3]
- adds r3, r2, #1
- bne .L1330
- ldr r3, .L1335+8
- movs r5, #0
- ldr r0, .L1335+12
- ldrh r4, [r3]
- ldr r0, [r0]
- strh r5, [r0, r4, lsl #1] @ movhi
- strh r2, [r3] @ movhi
- ldr r2, .L1335+16
- ldr r0, [r1, #4]
- ldr r3, [r2, #96]
- ubfx r0, r0, #10, #16
- adds r3, r3, #1
- str r3, [r2, #96]
- bl FtlBbmMapBadBlock
- bl FtlBbmTblFlush
- bl FtlGcPageVarInit
-.L1334:
- movs r0, #1
-.L1328:
- pop {r3, r4, r5, r6, r7, pc}
-.L1330:
- ldr r3, [r1, #12]
+ ldr r0, [r1, #12]
ldr r1, [r1, #4]
- ldr r2, [r3, #8]
- ldr r0, [r3, #12]
+ adds r3, r2, #1
+ it ne
+ ldrne r2, [r0, #8]
+ ldr r0, [r0, #12]
bl FtlGcUpdatePage
- b .L1329
-.L1336:
+ b .L1356
+.L1364:
.align 2
-.L1335:
+.L1363:
.word .LANCHOR62
.word .LANCHOR104
.word .LANCHOR53
- .word .LANCHOR42
- .word .LANCHOR135
.size Ftl_gc_temp_data_write_back, .-Ftl_gc_temp_data_write_back
.section .text.Ftl_get_new_temp_ppa,"ax",%progbits
.align 1
@@ -10111,34 +10079,34 @@ Ftl_get_new_temp_ppa:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, lr}
movw r3, #65535
- ldr r4, .L1340
+ ldr r4, .L1368
ldrh r2, [r4]
cmp r2, r3
- beq .L1338
+ beq .L1366
ldrh r3, [r4, #4]
- cbnz r3, .L1339
-.L1338:
+ cbnz r3, .L1367
+.L1366:
movs r0, #0
movs r5, #0
bl FtlGcFreeTempBlock
- ldr r0, .L1340
+ ldr r0, .L1368
strb r5, [r4, #8]
bl allocate_data_superblock
- ldr r3, .L1340+4
+ ldr r3, .L1368+4
strh r5, [r3] @ movhi
- ldr r3, .L1340+8
+ ldr r3, .L1368+8
strh r5, [r3] @ movhi
bl l2p_flush
mov r0, r5
bl FtlEctTblFlush
bl FtlVpcTblFlush
-.L1339:
- ldr r0, .L1340
+.L1367:
+ ldr r0, .L1368
pop {r3, r4, r5, lr}
b get_new_active_ppa
-.L1341:
+.L1369:
.align 2
-.L1340:
+.L1368:
.word .LANCHOR53
.word .LANCHOR69
.word .LANCHOR70
@@ -10154,184 +10122,188 @@ Ftl_get_new_temp_ppa:
rk_ftl_garbage_collect:
@ args = 0, pretend = 0, frame = 40
@ frame_needed = 0, uses_anonymous_args = 0
- ldr r3, .L1424
+ ldr r3, .L1460
push {r4, r5, r6, r7, r8, r10, fp, lr}
- sub sp, sp, #40
- str r0, [sp, #20]
+ sub sp, sp, #48
+ str r0, [sp, #28]
ldr r0, [r3]
cmp r0, #0
- bne .L1394
- ldr r3, .L1424+4
+ bne .L1427
+ ldr r3, .L1460+4
ldrh r3, [r3]
cmp r3, #47
- bls .L1342
- ldr r3, .L1424+8
+ bls .L1370
+ ldr r3, .L1460+8
movw r4, #65535
ldrh r0, [r3]
cmp r0, r4
- beq .L1344
- ldr r1, .L1424+12
+ beq .L1372
+ ldr r1, .L1460+12
ldrh r2, [r1]
cmp r2, r4
itt eq
strheq r0, [r1] @ movhi
strheq r2, [r3] @ movhi
-.L1344:
- ldr r3, [sp, #20]
+.L1372:
+ ldr r3, [sp, #28]
cmp r3, #0
- bne .L1396
- ldr r3, .L1424+16
+ bne .L1429
+ ldr r3, .L1460+16
ldrh r3, [r3]
cmp r3, #24
- bhi .L1397
- ldr r2, .L1424+20
+ bhi .L1430
+ ldr r2, .L1460+20
cmp r3, #16
ldrh r4, [r2]
- bls .L1347
+ bls .L1375
lsrs r4, r4, #5
-.L1346:
- ldr r2, .L1424+24
+.L1374:
+ ldr r2, .L1460+24
ldrh r1, [r2]
cmp r1, r3
mov r1, r2
- bcs .L1350
- ldr r3, .L1424+28
+ bcs .L1378
+ ldr r3, .L1460+28
movw r0, #65535
ldrh r3, [r3]
cmp r3, r0
- bne .L1351
- ldr r0, .L1424+12
+ bne .L1379
+ ldr r0, .L1460+12
ldrh r0, [r0]
cmp r0, r3
- bne .L1351
- ldr r3, .L1424+32
+ bne .L1379
+ ldr r3, .L1460+32
ldrh r0, [r3]
- cbnz r0, .L1352
- ldr r3, .L1424+36
- ldr r4, .L1424+40
+ cbnz r0, .L1380
+ ldr r3, .L1460+36
+ ldr r4, .L1460+40
ldr r3, [r3]
ldr r4, [r4]
add r3, r3, r3, lsl #1
cmp r4, r3, lsr #2
- bcs .L1353
-.L1352:
- ldr r3, .L1424+44
+ bcs .L1381
+.L1380:
+ ldr r3, .L1460+44
ldrh r3, [r3]
add r3, r3, r3, lsl #1
asrs r3, r3, #2
strh r3, [r1] @ movhi
-.L1354:
- ldr r3, .L1424+48
+.L1382:
+ ldr r3, .L1460+48
movs r2, #0
str r2, [r3]
-.L1342:
- add sp, sp, #40
+.L1370:
+ add sp, sp, #48
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1347:
+.L1375:
cmp r3, #12
- bls .L1348
+ bls .L1376
lsrs r4, r4, #4
- b .L1346
-.L1348:
+ b .L1374
+.L1376:
cmp r3, #8
- bls .L1346
+ bls .L1374
lsrs r4, r4, #2
- b .L1346
-.L1397:
+ b .L1374
+.L1430:
movs r4, #1
- b .L1346
-.L1353:
+ b .L1374
+.L1381:
movs r3, #18
strh r3, [r2] @ movhi
- b .L1354
-.L1351:
- ldr r3, .L1424+44
+ b .L1382
+.L1379:
+ ldr r3, .L1460+44
ldrh r3, [r3]
add r3, r3, r3, lsl #1
asrs r3, r3, #2
strh r3, [r1] @ movhi
-.L1350:
- ldr r3, .L1424+52
+.L1378:
+ ldr r3, .L1460+52
ldrh r3, [r3]
- cbz r3, .L1345
+ cbz r3, .L1373
adds r4, r4, #32
uxth r4, r4
-.L1345:
- ldr r5, .L1424+56
+.L1373:
+ ldr r5, .L1460+56
movw r3, #65535
ldrh r2, [r5]
cmp r2, r3
- bne .L1357
- ldr r3, .L1424+12
+ bne .L1385
+ ldr r3, .L1460+12
ldrh r1, [r3]
cmp r1, r2
- beq .L1358
- ldr r0, .L1424+60
+ beq .L1386
+ ldr r0, .L1460+60
ldr r0, [r0]
ldrh r1, [r0, r1, lsl #1]
- cbnz r1, .L1359
+ cbnz r1, .L1387
strh r2, [r3] @ movhi
-.L1359:
+.L1387:
ldrh r2, [r3]
strh r2, [r5] @ movhi
movw r2, #65535
strh r2, [r3] @ movhi
-.L1358:
+.L1386:
ldrh r0, [r5]
movw r6, #65535
movs r3, #0
strb r3, [r5, #8]
cmp r0, r6
- beq .L1357
+ beq .L1385
bl IsBlkInGcList
- cbz r0, .L1361
+ cbz r0, .L1389
strh r6, [r5] @ movhi
-.L1361:
+.L1389:
ldrh r2, [r5]
movw r3, #65535
cmp r2, r3
- beq .L1357
- ldr r0, .L1424+56
+ beq .L1385
+ ldr r0, .L1460+56
bl make_superblock
- ldr r2, .L1424+64
+ ldr r2, .L1460+64
movs r3, #0
strh r3, [r5, #2] @ movhi
strb r3, [r5, #6]
strh r3, [r2] @ movhi
- ldr r3, .L1424+60
+ ldr r3, .L1460+60
ldrh r2, [r5]
ldr r3, [r3]
ldrh r2, [r3, r2, lsl #1]
- ldr r3, .L1424+68
+ ldr r3, .L1460+68
strh r2, [r3] @ movhi
-.L1357:
- ldr r2, .L1424+72
+.L1385:
+ ldr r2, .L1460+72
ldrh r3, [r5]
ldrh r2, [r2]
cmp r2, r3
- beq .L1362
- ldr r2, .L1424+76
+ beq .L1390
+ ldr r2, .L1460+76
ldrh r2, [r2]
cmp r2, r3
- bne .L1363
-.L1362:
+ beq .L1390
+ ldr r2, .L1460+28
+ ldrh r2, [r2]
+ cmp r2, r3
+ bne .L1391
+.L1390:
movw r3, #65535
strh r3, [r5] @ movhi
-.L1363:
- ldr r5, .L1424+56
+.L1391:
+ ldr r5, .L1460+56
mov r6, r5
-.L1393:
+.L1426:
ldrh r2, [r5]
movw r3, #65535
cmp r2, r3
- bne .L1364
- ldr fp, .L1424+88
+ bne .L1392
+ ldr fp, .L1460+88
movs r2, #0
- ldr r3, .L1424+48
+ ldr r3, .L1460+48
mov r8, fp
str r2, [r3]
-.L1365:
+.L1393:
ldrh r7, [fp]
mov r0, r7
bl List_get_gc_head_node
@@ -10339,78 +10311,78 @@ rk_ftl_garbage_collect:
movw r1, #65535
cmp r3, r1
strh r3, [r6] @ movhi
- bne .L1366
+ bne .L1394
movs r3, #0
movs r0, #8
strh r3, [fp] @ movhi
- b .L1342
-.L1396:
+ b .L1370
+.L1429:
movs r4, #1
- b .L1345
-.L1366:
- str r0, [sp, #8]
+ b .L1373
+.L1394:
+ str r0, [sp, #16]
mov r0, r3
- str r3, [sp, #4]
+ str r3, [sp, #12]
adds r7, r7, #1
bl IsBlkInGcList
- ldr r3, [sp, #4]
- ldr r2, [sp, #8]
- cbz r0, .L1367
+ ldr r3, [sp, #12]
+ ldr r2, [sp, #16]
+ cbz r0, .L1395
strh r7, [fp] @ movhi
- b .L1365
-.L1367:
+ b .L1393
+.L1395:
uxth r0, r2
- ldr r2, .L1424+20
- ldr r10, .L1424+60
+ ldr r2, .L1460+20
+ ldr r10, .L1460+60
uxth r7, r7
ldrh lr, [r2]
- ldr r2, .L1424+80
+ ldr r2, .L1460+80
ldr r1, [r10]
strh r7, [fp] @ movhi
ldrh r2, [r2]
ldrh ip, [r1, r0, lsl #1]
mul r2, r2, lr
cmp ip, r2, asr #1
- bgt .L1369
+ bgt .L1397
cmp r7, #48
- bls .L1370
+ bls .L1398
cmp ip, #8
- bls .L1370
- ldr r7, .L1424+84
+ bls .L1398
+ ldr r7, .L1460+84
ldrh r7, [r7]
cmp r7, #35
- bhi .L1370
-.L1369:
+ bhi .L1398
+.L1397:
movs r7, #0
strh r7, [r8] @ movhi
-.L1370:
+.L1398:
ldrh r1, [r1, r0, lsl #1]
cmp r2, r1
- bgt .L1371
+ bgt .L1399
ldrh r2, [r8]
cmp r2, #3
- bhi .L1371
+ bhi .L1399
movw r3, #65535
strh r3, [r6] @ movhi
movs r3, #0
strh r3, [r8] @ movhi
-.L1423:
- ldr r3, .L1424+32
+.L1459:
+ ldr r3, .L1460+32
ldrh r0, [r3]
- b .L1342
-.L1371:
- cbnz r1, .L1372
+ b .L1370
+.L1399:
+ cbnz r1, .L1400
movw r0, #65535
bl decrement_vpc_count
ldrh r3, [r8]
adds r3, r3, #1
strh r3, [r8] @ movhi
- b .L1365
-.L1425:
+ b .L1393
+.L1461:
.align 2
-.L1424:
+.L1460:
.word .LANCHOR94
- .word .LANCHOR45
+ .word .LANCHOR44
.word .LANCHOR73
.word .LANCHOR72
.word .LANCHOR48
@@ -10423,7 +10395,7 @@ rk_ftl_garbage_collect:
.word .LANCHOR171
.word .LANCHOR95
.word .LANCHOR74
- .word .LANCHOR144
+ .word .LANCHOR145
.word .LANCHOR42
.word .LANCHOR173
.word .LANCHOR174
@@ -10432,65 +10404,65 @@ rk_ftl_garbage_collect:
.word .LANCHOR3
.word .LANCHOR69
.word .LANCHOR102
-.L1372:
+.L1400:
movs r2, #0
strb r2, [r6, #8]
- ldr r2, .L1426
+ ldr r2, .L1462
ldrh r2, [r2]
cmp r2, r3
- bne .L1373
- mov r2, #700
- ldr r1, .L1426+4
- ldr r0, .L1426+8
+ bne .L1401
+ movw r2, #717
+ ldr r1, .L1462+4
+ ldr r0, .L1462+8
bl printf
-.L1373:
- ldr r3, .L1426+12
+.L1401:
+ ldr r3, .L1462+12
ldrh r2, [r6]
ldrh r3, [r3]
cmp r2, r3
- bne .L1374
- movw r2, #701
- ldr r1, .L1426+4
- ldr r0, .L1426+8
+ bne .L1402
+ movw r2, #718
+ ldr r1, .L1462+4
+ ldr r0, .L1462+8
bl printf
-.L1374:
- ldr r3, .L1426+16
+.L1402:
+ ldr r3, .L1462+16
ldrh r2, [r6]
ldrh r3, [r3]
cmp r2, r3
- bne .L1375
- movw r2, #702
- ldr r1, .L1426+4
- ldr r0, .L1426+8
+ bne .L1403
+ movw r2, #719
+ ldr r1, .L1462+4
+ ldr r0, .L1462+8
bl printf
-.L1375:
+.L1403:
mov r0, r5
bl make_superblock
- ldr r2, .L1426+20
+ ldr r2, .L1462+20
movs r3, #0
ldrh r1, [r6]
strh r3, [r2] @ movhi
ldr r2, [r10]
ldrh r1, [r2, r1, lsl #1]
- ldr r2, .L1426+24
+ ldr r2, .L1462+24
strh r3, [r6, #2] @ movhi
strb r3, [r6, #6]
strh r1, [r2] @ movhi
-.L1364:
- ldr r3, .L1426+28
+.L1392:
+ ldr r3, .L1462+28
movs r2, #1
str r2, [r3]
- ldr r3, .L1426+32
+ ldr r3, .L1462+32
ldrh r3, [r3]
- str r3, [sp, #12]
- ldr r3, [sp, #20]
- cbz r3, .L1376
- ldr r3, .L1426+36
- ldr r2, [sp, #12]
+ str r3, [sp, #16]
+ ldr r3, [sp, #28]
+ cbz r3, .L1404
+ ldr r3, .L1462+36
+ ldr r2, [sp, #16]
ldrh r1, [r6]
ldrh r3, [r3]
muls r3, r2, r3
- ldr r2, .L1426+40
+ ldr r2, .L1462+40
ldr r2, [r2]
ldrh r2, [r2, r1, lsl #1]
subs r3, r3, r2
@@ -10498,10 +10470,10 @@ rk_ftl_garbage_collect:
addmi r3, r3, #3
add r4, r4, r3, asr #2
uxth r4, r4
-.L1376:
+.L1404:
ldrh r3, [r6, #2]
- ldr r1, [sp, #12]
- ldr fp, .L1426+64
+ ldr r1, [sp, #16]
+ ldr fp, .L1462+64
adds r2, r3, r4
cmp r2, r1
itt gt
@@ -10510,94 +10482,94 @@ rk_ftl_garbage_collect:
mov r3, #0
it gt
uxthgt r4, r4
- str r3, [sp, #8]
-.L1379:
- ldrh r3, [sp, #8]
+ str r3, [sp, #24]
+.L1407:
+ ldrh r3, [sp, #24]
cmp r4, r3
- bls .L1387
- ldr r3, .L1426+36
+ bls .L1415
+ ldr r3, .L1462+36
movw r10, #65535
ldrh r1, [r5, #2]
mov ip, #20
ldr r0, [fp]
ldrh lr, [r3]
- ldr r3, [sp, #8]
- ldr r7, .L1426+44
+ ldr r3, [sp, #24]
+ ldr r7, .L1462+44
adds r3, r1, r3
- str r3, [sp, #16]
+ str r3, [sp, #20]
movs r3, #0
- str r3, [sp, #4]
- b .L1388
-.L1381:
+ str r3, [sp, #12]
+ b .L1416
+.L1409:
ldrh r2, [r7, #2]!
cmp r2, r10
- beq .L1380
- ldr r1, [sp, #4]
+ beq .L1408
+ ldr r1, [sp, #12]
mla r8, ip, r1, r0
- ldr r1, [sp, #16]
+ ldr r1, [sp, #20]
orr r2, r1, r2, lsl #10
str r2, [r8, #4]
- ldr r2, [sp, #4]
+ ldr r2, [sp, #12]
adds r2, r2, #1
uxth r2, r2
- str r2, [sp, #4]
-.L1380:
+ str r2, [sp, #12]
+.L1408:
adds r3, r3, #1
-.L1388:
+.L1416:
uxth r2, r3
cmp lr, r2
- bhi .L1381
+ bhi .L1409
ldrb r2, [r5, #8] @ zero_extendqisi2
- ldr r1, [sp, #4]
+ ldr r1, [sp, #12]
bl FlashReadPages
movs r3, #0
-.L1422:
- str r3, [sp, #16]
- ldr r2, [sp, #4]
- ldrh r3, [sp, #16]
+.L1458:
+ str r3, [sp, #20]
+ ldr r2, [sp, #12]
+ ldrh r3, [sp, #20]
cmp r2, r3
- bhi .L1386
- ldr r3, [sp, #8]
+ bhi .L1414
+ ldr r3, [sp, #24]
adds r3, r3, #1
- str r3, [sp, #8]
- b .L1379
-.L1386:
- ldr r3, [sp, #16]
+ str r3, [sp, #24]
+ b .L1407
+.L1414:
+ ldr r3, [sp, #20]
movs r7, #20
muls r7, r3, r7
ldr r3, [fp]
adds r2, r3, r7
ldr r3, [r3, r7]
adds r3, r3, #1
- beq .L1383
+ beq .L1411
ldr r8, [r2, #12]
movw r3, #61589
ldrh r2, [r8]
cmp r2, r3
- bne .L1383
+ bne .L1411
ldr r10, [r8, #8]
cmp r10, #-1
- bne .L1384
- mov r2, #736
- ldr r1, .L1426+4
- ldr r0, .L1426+8
+ bne .L1412
+ movw r2, #753
+ ldr r1, .L1462+4
+ ldr r0, .L1462+8
bl printf
-.L1384:
+.L1412:
movs r2, #0
- add r1, sp, #36
+ add r1, sp, #40
mov r0, r10
bl log2phys
ldr r0, [fp]
- ldr r3, [sp, #36]
+ ldr r3, [sp, #40]
add r0, r0, r7
ldr r2, [r0, #4]
cmp r2, r3
- bne .L1383
- ldr r2, .L1426+20
- ldr r10, .L1426+56
- ldr r1, .L1426+48
+ bne .L1411
+ ldr r2, .L1462+20
+ ldr r10, .L1462+60
+ ldr r1, .L1462+48
ldrh r3, [r2]
- str r1, [sp, #28]
+ str r1, [sp, #36]
adds r3, r3, #1
strh r3, [r2] @ movhi
ldr r2, [r1]
@@ -10606,10 +10578,10 @@ rk_ftl_garbage_collect:
mla r3, r1, r3, r2
ldr r2, [r0, #16]
str r2, [r3, #16]
- str r3, [sp, #24]
+ str r3, [sp, #32]
bl Ftl_get_new_temp_ppa
- ldr r3, [sp, #24]
- ldr r1, [sp, #28]
+ ldr r3, [sp, #32]
+ ldr r1, [sp, #36]
str r0, [r3, #4]
ldr r2, [r1]
movs r1, #20
@@ -10617,18 +10589,18 @@ rk_ftl_garbage_collect:
ldr r0, [fp]
mla r2, r1, r3, r2
add r0, r0, r7
- ldr r7, .L1426+16
+ ldr r7, .L1462+16
ldr r1, [r0, #8]
adds r3, r3, #1
str r1, [r2, #8]
ldr r1, [r0, #12]
str r1, [r2, #12]
movs r1, #1
- ldr r2, [sp, #36]
+ ldr r2, [sp, #40]
str r2, [r8, #12]
ldrh r2, [r7]
strh r2, [r8, #2] @ movhi
- ldr r2, .L1426+52
+ ldr r2, .L1462+52
str r3, [r10]
ldr r2, [r2]
str r2, [r8, #4]
@@ -10636,90 +10608,148 @@ rk_ftl_garbage_collect:
ldrb r2, [r7, #7] @ zero_extendqisi2
ldr r3, [r10]
cmp r2, r3
- beq .L1385
+ beq .L1413
ldrh r3, [r7, #4]
- cbnz r3, .L1383
-.L1385:
+ cbnz r3, .L1411
+.L1413:
bl Ftl_gc_temp_data_write_back
- cbz r0, .L1383
- ldr r3, .L1426+28
+ cbz r0, .L1411
+ ldr r3, .L1462+28
movs r2, #0
+ movw r1, #65535
str r2, [r3]
- b .L1423
-.L1383:
- ldr r3, [sp, #16]
+ ldr r3, .L1462+56
+ strh r1, [r3] @ movhi
+ strh r2, [r3, #2] @ movhi
+ b .L1459
+.L1411:
+ ldr r3, [sp, #20]
adds r3, r3, #1
- b .L1422
-.L1387:
+ b .L1458
+.L1415:
ldrh r3, [r5, #2]
add r4, r4, r3
- ldr r3, [sp, #12]
+ ldr r3, [sp, #16]
uxth r4, r4
cmp r3, r4
strh r4, [r5, #2] @ movhi
- ldr r4, .L1426+28
- bhi .L1389
- ldr r3, .L1426+56
+ bhi .L1417
+ ldr r3, .L1462+60
ldr r3, [r3]
- cbz r3, .L1390
+ cbz r3, .L1418
bl Ftl_gc_temp_data_write_back
- cbz r0, .L1390
- movs r3, #0
- str r3, [r4]
- b .L1423
-.L1390:
- ldr r3, .L1426+20
- ldrh r1, [r3]
- cbnz r1, .L1391
- ldr r3, .L1426+40
+ cbz r0, .L1418
+ ldr r3, .L1462+28
+ movs r2, #0
+ str r2, [r3]
+ b .L1459
+.L1463:
+ .align 2
+.L1462:
+ .word .LANCHOR51
+ .word .LANCHOR175
+ .word .LC1
+ .word .LANCHOR52
+ .word .LANCHOR53
+ .word .LANCHOR173
+ .word .LANCHOR174
+ .word .LANCHOR94
+ .word .LANCHOR19
+ .word .LANCHOR3
+ .word .LANCHOR42
+ .word .LANCHOR145+14
+ .word .LANCHOR104
+ .word .LANCHOR83
+ .word .LANCHOR145
+ .word .LANCHOR62
+ .word .LANCHOR66
+.L1418:
+ ldr r3, .L1464
+ ldrh r4, [r3]
+ cmp r4, #0
+ bne .L1419
+ ldr r8, .L1464+28
+ ldrh r1, [r5]
+ ldr r3, [r8]
+ ldrh r3, [r3, r1, lsl #1]
+ cmp r3, #0
+ beq .L1419
+ ldr r0, .L1464+4
+ ldr r10, .L1464+32
+ ldrh r2, [r5, #2]
+ ldrh r0, [r0]
+ str r3, [sp]
+ mov r3, r4
+ str r0, [sp, #4]
+ ldr r0, .L1464+8
+ bl printf
+.L1420:
+ ldr r3, [r10]
+ cmp r4, r3
+ bcs .L1422
+ movs r2, #0
+ add r1, sp, #44
+ mov r0, r4
+ bl log2phys
+ ldr r7, [sp, #44]
+ adds r3, r7, #1
+ beq .L1421
+ ubfx r0, r7, #10, #16
+ bl P2V_block_in_plane
+ ldrh r3, [r5]
+ cmp r3, r0
+ bne .L1421
+ mov r2, r7
+ mov r1, r4
+ ldr r0, .L1464+12
+ bl printf
+.L1422:
+ ldr r3, [r10]
+ cmp r4, r3
+ bcc .L1419
ldrh r2, [r5]
- ldr r3, [r3]
- ldrh r0, [r3, r2, lsl #1]
- cbz r0, .L1391
+ movs r1, #0
+ ldr r3, [r8]
strh r1, [r3, r2, lsl #1] @ movhi
ldrh r0, [r5]
bl update_vpc_list
bl l2p_flush
bl FtlVpcTblFlush
-.L1391:
+.L1419:
movw r3, #65535
strh r3, [r5] @ movhi
-.L1389:
- movs r3, #0
- str r3, [r4]
- ldr r3, .L1426+60
+.L1417:
+ ldr r3, .L1464+16
+ movs r2, #0
+ str r2, [r3]
+ ldr r3, .L1464+20
ldrh r0, [r3]
cmp r0, #2
- bhi .L1392
- ldr r3, .L1426+32
+ bhi .L1425
+ ldr r3, .L1464+24
ldrh r4, [r3]
- b .L1393
-.L1392:
+ b .L1426
+.L1421:
+ adds r4, r4, #1
+ b .L1420
+.L1425:
adds r0, r0, #1
- b .L1342
-.L1394:
- movs r0, #0
- b .L1342
+ b .L1370
.L1427:
+ movs r0, #0
+ b .L1370
+.L1465:
.align 2
-.L1426:
- .word .LANCHOR51
- .word .LANCHOR175
- .word .LC1
- .word .LANCHOR52
- .word .LANCHOR53
+.L1464:
.word .LANCHOR173
.word .LANCHOR174
+ .word .LC42
+ .word .LC43
.word .LANCHOR94
+ .word .LANCHOR48
.word .LANCHOR19
- .word .LANCHOR3
.word .LANCHOR42
- .word .LANCHOR144+14
- .word .LANCHOR104
- .word .LANCHOR83
- .word .LANCHOR62
- .word .LANCHOR48
- .word .LANCHOR66
+ .word .LANCHOR152
.size rk_ftl_garbage_collect, .-rk_ftl_garbage_collect
.section .text.FtlRead,"ax",%progbits
.align 1
@@ -10738,31 +10768,31 @@ FtlRead:
mov r6, r1
mov r8, r3
str r2, [sp, #24]
- bne .L1429
+ bne .L1467
mov r2, r3
ldr r1, [sp, #24]
add r0, r6, #256
bl FtlVendorPartRead
str r0, [sp, #4]
-.L1428:
+.L1466:
ldr r0, [sp, #4]
add sp, sp, #56
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1429:
+.L1467:
ldr r3, [sp, #24]
adds r3, r1, r3
str r3, [sp, #12]
- ldr r3, .L1461
+ ldr r3, .L1499
ldr r2, [sp, #12]
ldr r3, [r3]
cmp r2, r3
- bhi .L1450
- ldr r3, .L1461+4
+ bhi .L1488
+ ldr r3, .L1499+4
ldr r3, [r3]
adds r4, r3, #1
- beq .L1451
- ldr r3, .L1461+8
+ beq .L1489
+ ldr r3, .L1499+8
mov r0, r6
movs r7, #0
mov r5, r7
@@ -10775,7 +10805,7 @@ FtlRead:
subs r0, r3, #1
bl __aeabi_uidiv
ldr r3, [sp, #16]
- ldr r2, .L1461+12
+ ldr r2, .L1499+12
ldr r1, [sp, #24]
rsb r3, r3, #1
ldr r4, [sp, #16]
@@ -10788,54 +10818,54 @@ FtlRead:
add r3, r3, r1
ldr r1, [sp, #8]
str r3, [r2]
- ldr r2, .L1461+16
+ ldr r2, .L1499+16
str r7, [sp, #4]
ldr r3, [r2]
add r3, r3, r1
str r3, [r2]
-.L1431:
+.L1469:
ldr r3, [sp, #8]
- cbnz r3, .L1448
- ldr r3, .L1461+20
+ cbnz r3, .L1486
+ ldr r3, .L1499+20
ldrh r3, [r3]
- cbnz r3, .L1449
- ldr r3, .L1461+24
+ cbnz r3, .L1487
+ ldr r3, .L1499+24
ldrh r3, [r3]
cmp r3, #31
- bhi .L1428
-.L1449:
+ bhi .L1466
+.L1487:
movs r1, #1
movs r0, #0
bl rk_ftl_garbage_collect
- b .L1428
-.L1448:
+ b .L1466
+.L1486:
movs r2, #0
add r1, sp, #52
mov r0, r4
bl log2phys
ldr r3, [sp, #52]
adds r0, r3, #1
- bne .L1432
- ldr fp, .L1461+8
+ bne .L1470
+ ldr fp, .L1499+8
mov r10, #0
-.L1433:
+.L1471:
ldrh r0, [fp]
cmp r10, r0
- bcc .L1435
-.L1436:
+ bcc .L1473
+.L1474:
ldr r3, [sp, #8]
adds r4, r4, #1
subs r3, r3, #1
str r3, [sp, #8]
- beq .L1440
- ldr r3, .L1461+28
+ beq .L1478
+ ldr r3, .L1499+28
ldrh r3, [r3]
cmp r5, r3, lsl #2
- bne .L1431
-.L1440:
+ bne .L1469
+.L1478:
cmp r5, #0
- beq .L1431
- ldr r3, .L1461+32
+ beq .L1469
+ ldr r3, .L1499+32
movs r2, #0
mov r1, r5
mov r10, #0
@@ -10849,29 +10879,29 @@ FtlRead:
ldr r3, [sp, #32]
lsls r3, r3, #9
str r3, [sp, #40]
-.L1447:
+.L1485:
movs r3, #20
mul fp, r3, r10
- ldr r3, .L1461+32
+ ldr r3, .L1499+32
ldr r2, [r3]
ldr r3, [sp, #16]
add r2, r2, fp
ldr r1, [r2, #16]
cmp r3, r1
- bne .L1442
+ bne .L1480
ldr r1, [r2, #8]
- ldr r2, .L1461+36
+ ldr r2, .L1499+36
ldr r2, [r2]
cmp r1, r2
- bne .L1443
+ bne .L1481
ldr r3, [sp, #36]
mov r0, r8
ldr r2, [sp, #40]
add r1, r1, r3
-.L1460:
+.L1498:
bl ftl_memcpy
-.L1443:
- ldr r3, .L1461+32
+.L1481:
+ ldr r3, .L1499+32
ldr r3, [r3]
add r2, r3, fp
ldr r3, [r3, fp]
@@ -10880,49 +10910,49 @@ FtlRead:
ldr r0, [r0, #8]
cmp r1, r0
itttt ne
- ldrne r0, .L1461+40
+ ldrne r0, .L1499+40
ldrne r1, [r0, #72]
addne r1, r1, #1
strne r1, [r0, #72]
adds r1, r3, #1
- bne .L1445
- ldr r1, .L1461+40
+ bne .L1483
+ ldr r1, .L1499+40
str r3, [sp, #4]
ldr r2, [r1, #72]
adds r2, r2, #1
str r2, [r1, #72]
-.L1446:
+.L1484:
add r10, r10, #1
cmp r5, r10
- bne .L1447
+ bne .L1485
movs r5, #0
- b .L1431
-.L1435:
+ b .L1469
+.L1473:
mla r0, r0, r4, r10
cmp r6, r0
- bhi .L1434
+ bhi .L1472
ldr r3, [sp, #12]
cmp r3, r0
- bls .L1434
+ bls .L1472
subs r0, r0, r6
mov r2, #512
movs r1, #0
add r0, r8, r0, lsl #9
bl ftl_memset
-.L1434:
+.L1472:
add r10, r10, #1
- b .L1433
-.L1432:
- ldr r2, .L1461+32
+ b .L1471
+.L1470:
+ ldr r2, .L1499+32
mov r10, #20
ldr r2, [r2]
mla r10, r10, r5, r2
str r3, [r10, #4]
ldr r3, [sp, #16]
cmp r4, r3
- ldr r3, .L1461+8
- bne .L1437
- ldr r2, .L1461+36
+ ldr r3, .L1499+8
+ bne .L1475
+ ldr r2, .L1499+36
mov r0, r6
ldrh fp, [r3]
ldr r2, [r2]
@@ -10937,11 +10967,11 @@ FtlRead:
movcs r3, r2
cmp fp, r3
str r3, [sp, #32]
- bne .L1438
+ bne .L1476
str r8, [r10, #8]
-.L1438:
- ldr r3, .L1461+44
- ldr r2, .L1461+48
+.L1476:
+ ldr r3, .L1499+44
+ ldr r2, .L1499+48
str r4, [r10, #16]
ldrh r3, [r3]
ldr r2, [r2]
@@ -10950,12 +10980,12 @@ FtlRead:
bic r3, r3, #3
add r3, r3, r2
str r3, [r10, #12]
- b .L1436
-.L1437:
+ b .L1474
+.L1475:
ldr r2, [sp, #20]
cmp r4, r2
- bne .L1439
- ldr r2, .L1461+52
+ bne .L1477
+ ldr r2, .L1499+52
ldr r1, [sp, #12]
ldr r2, [r2]
str r2, [r10, #8]
@@ -10963,49 +10993,49 @@ FtlRead:
mul r3, r2, r4
subs r7, r1, r3
cmp r2, r7
- bne .L1438
-.L1459:
+ bne .L1476
+.L1497:
subs r3, r3, r6
add r3, r8, r3, lsl #9
str r3, [r10, #8]
- b .L1438
-.L1439:
+ b .L1476
+.L1477:
ldrh r3, [r3]
muls r3, r4, r3
- b .L1459
-.L1442:
+ b .L1497
+.L1480:
ldr r3, [sp, #20]
cmp r3, r1
- bne .L1443
- ldr r3, .L1461+52
+ bne .L1481
+ ldr r3, .L1499+52
ldr r1, [r2, #8]
ldr r2, [r3]
cmp r1, r2
- bne .L1443
- ldr r2, .L1461+8
+ bne .L1481
+ ldr r2, .L1499+8
ldr r3, [sp, #20]
ldrh r0, [r2]
ldr r2, [sp, #44]
muls r0, r3, r0
subs r0, r0, r6
add r0, r8, r0, lsl #9
- b .L1460
-.L1445:
+ b .L1498
+.L1483:
cmp r3, #256
- bne .L1446
+ bne .L1484
ldr r0, [r2, #4]
ubfx r0, r0, #10, #16
bl P2V_block_in_plane
bl FtlGcRefreshBlock
- b .L1446
-.L1450:
+ b .L1484
+.L1488:
mov r3, #-1
-.L1451:
+.L1489:
str r3, [sp, #4]
- b .L1428
-.L1462:
+ b .L1466
+.L1500:
.align 2
-.L1461:
+.L1499:
.word .LANCHOR34
.word .LANCHOR166
.word .LANCHOR12
@@ -11053,37 +11083,35 @@ FtlWrite:
cmp r0, #16
push {r4, r5, r6, r7, r8, r10, fp, lr}
sub sp, sp, #72
- str r1, [sp, #4]
+ mov fp, r1
str r2, [sp, #20]
str r3, [sp, #16]
- bne .L1465
+ bne .L1503
mov r2, r3
- ldr r3, [sp, #4]
ldr r1, [sp, #20]
- add r0, r3, #256
+ add r0, fp, #256
bl FtlVendorPartWrite
-.L1464:
+.L1502:
add sp, sp, #72
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1465:
- ldr r3, [sp, #4]
- ldr r2, [sp, #20]
- adds r4, r3, r2
- ldr r3, .L1508
+.L1503:
+ ldr r3, [sp, #20]
+ adds r4, r1, r3
+ ldr r3, .L1547
ldr r3, [r3]
cmp r4, r3
- bhi .L1498
- ldr r3, .L1508+4
+ bhi .L1536
+ ldr r3, .L1547+4
ldr r0, [r3]
- adds r5, r0, #1
- beq .L1464
- ldr r3, .L1508+8
+ adds r1, r0, #1
+ beq .L1502
+ ldr r3, .L1547+8
mov r2, #2048
- ldr r0, [sp, #4]
- ldr r7, .L1508+12
+ mov r0, fp
+ ldr r7, .L1547+12
str r2, [r3]
- ldr r3, .L1508+16
+ ldr r3, .L1547+16
ldrh r5, [r3]
mov r1, r5
bl __aeabi_uidiv
@@ -11095,7 +11123,7 @@ FtlWrite:
ldr r1, [sp, #20]
ldr r5, [sp, #12]
subs r3, r0, r2
- ldr r2, .L1508+20
+ ldr r2, .L1547+20
str r3, [sp, #32]
adds r3, r3, #1
str r3, [sp, #8]
@@ -11104,39 +11132,39 @@ FtlWrite:
add r3, r3, r1
ldr r1, [sp, #8]
str r3, [r2]
- ldr r2, .L1508+24
+ ldr r2, .L1547+24
ldr r3, [r2]
add r3, r3, r1
str r3, [r2]
-.L1467:
+.L1505:
ldr r3, [sp, #8]
- cbnz r3, .L1493
- ldr r5, .L1508+28
+ cbnz r3, .L1531
+ ldr r5, .L1547+28
mov r0, r3
ldr r1, [sp, #32]
bl rk_ftl_garbage_collect
ldrh r2, [r5]
cmp r2, #5
- bls .L1494
-.L1496:
+ bls .L1532
+.L1534:
movs r0, #0
- b .L1464
-.L1493:
- ldr r4, .L1508+32
+ b .L1502
+.L1531:
+ ldr r4, .L1547+32
ldrb r2, [r7, #6] @ zero_extendqisi2
ldrh r3, [r4]
cmp r2, r3
- bcc .L1468
- mov r2, #1016
- ldr r1, .L1508+36
- ldr r0, .L1508+40
+ bcc .L1506
+ movw r2, #1038
+ ldr r1, .L1547+36
+ ldr r0, .L1547+40
bl printf
-.L1468:
+.L1506:
ldrh r3, [r7, #4]
- cbnz r3, .L1469
+ cbnz r3, .L1507
mov r0, r7
bl allocate_new_data_superblock
-.L1469:
+.L1507:
ldrb r3, [r7, #7] @ zero_extendqisi2
ldrh r2, [r7, #4]
lsls r3, r3, #2
@@ -11151,87 +11179,92 @@ FtlWrite:
str r3, [sp, #44]
ldrh r3, [r4]
cmp r2, r3
- bcc .L1470
- movw r2, #1049
- ldr r1, .L1508+36
- ldr r0, .L1508+40
+ bcc .L1508
+ movw r2, #1071
+ ldr r1, .L1547+36
+ ldr r0, .L1547+40
bl printf
-.L1470:
- ldr r8, .L1508+44
- mov fp, #0
-.L1471:
- ldr r3, [sp, #44]
- cmp fp, r3
- bne .L1491
-.L1472:
- ldr r0, .L1508+44
+.L1508:
+ ldr r8, .L1547+44
+ movs r3, #0
+ str r3, [sp, #4]
+.L1509:
+ ldr r3, [sp, #4]
+ ldr r2, [sp, #44]
+ cmp r3, r2
+ bne .L1529
+.L1510:
+ ldr r0, .L1547+44
mov r3, r7
movs r2, #0
- mov r1, fp
+ ldr r1, [sp, #4]
ldr r0, [r0]
bl FtlProgPages
- ldr r3, [sp, #8]
- cmp fp, r3
- bls .L1492
- movw r2, #1126
- ldr r1, .L1508+36
- ldr r0, .L1508+40
+ ldr r3, [sp, #4]
+ ldr r2, [sp, #8]
+ cmp r3, r2
+ bls .L1530
+ movw r2, #1149
+ ldr r1, .L1547+36
+ ldr r0, .L1547+40
bl printf
-.L1492:
+.L1530:
ldr r3, [sp, #8]
- sub r3, r3, fp
+ ldr r2, [sp, #4]
+ subs r3, r3, r2
str r3, [sp, #8]
- b .L1467
-.L1491:
- ldrh r2, [r7, #4]
- cmp r2, #0
- beq .L1472
+ b .L1505
+.L1529:
+ ldrh r3, [r7, #4]
+ cmp r3, #0
+ beq .L1510
movs r2, #0
add r1, sp, #48
mov r0, r5
movs r6, #20
bl log2phys
mov r0, r7
- mul r6, r6, fp
bl get_new_active_ppa
- ldr r2, .L1508+48
- ldr r1, [r8]
+ ldr r2, .L1547+48
+ ldr r1, [sp, #4]
+ ldr r3, [sp, #4]
ldrh r2, [r2]
- add r1, r1, r6
- str r0, [r1, #4]
- str r5, [r1, #16]
- mul r0, r2, fp
- bic r3, r0, #3
- ldr r0, .L1508+52
- str r3, [sp, #36]
- ldr r3, [r0]
+ muls r6, r3, r6
+ ldr r3, [r8]
+ muls r1, r2, r1
+ add r3, r3, r6
+ str r0, [r3, #4]
+ bic r1, r1, #3
+ str r5, [r3, #16]
+ str r1, [sp, #36]
+ ldr r1, .L1547+52
ldr r0, [sp, #36]
- str r3, [sp, #40]
- add r10, r3, r0
- str r10, [r1, #12]
- mov r0, r10
+ ldr r1, [r1]
+ add r10, r1, r0
+ str r1, [sp, #40]
+ str r10, [r3, #12]
movs r1, #0
+ mov r0, r10
bl ftl_memset
ldr r3, [sp, #12]
- ldr r2, .L1508+16
+ ldr r2, .L1547+16
cmp r5, r3
- beq .L1473
+ beq .L1511
ldr r3, [sp, #28]
cmp r5, r3
- bne .L1504
+ bne .L1542
ldrh r2, [r2]
- ldr r3, [sp, #4]
- ldr r1, [sp, #20]
+ ldr r3, [sp, #20]
smulbb r2, r2, r5
- adds r4, r3, r1
+ add r4, fp, r3
movs r3, #0
- subs r4, r4, r2
str r3, [sp, #24]
+ subs r4, r4, r2
uxth r4, r4
- b .L1476
-.L1473:
+ b .L1514
+.L1511:
ldrh r4, [r2]
- ldr r0, [sp, #4]
+ mov r0, fp
mov r1, r4
bl __aeabi_uidivmod
ldr r3, [sp, #20]
@@ -11240,144 +11273,140 @@ FtlWrite:
cmp r4, r3
it cs
movcs r4, r3
-.L1476:
- ldr r2, .L1508+16
+.L1514:
+ ldr r3, .L1547+16
+ ldrh r3, [r3]
+ cmp r4, r3
ldr r3, [sp, #12]
- ldrh r2, [r2]
- cmp r4, r2
- ldr r2, [r8]
- bne .L1477
+ bne .L1515
cmp r5, r3
- add r6, r6, r2
- ittet ne
- mulne r4, r4, r5
- ldrne r3, [sp, #4]
- ldreq r3, [sp, #16]
- subne r4, r4, r3
- itett ne
- ldrne r3, [sp, #16]
- streq r3, [r6, #8]
- addne r4, r3, r4, lsl #9
- strne r4, [r6, #8]
-.L1479:
- ldr r2, .L1508+32
- ldrb r1, [r7, #6] @ zero_extendqisi2
- ldrh r2, [r2]
- cmp r1, r2
- bcc .L1488
- movw r2, #1117
- ldr r1, .L1508+36
- ldr r0, .L1508+40
+ ldr r3, [r8]
+ add r6, r6, r3
+ bne .L1516
+ ldr r3, [sp, #16]
+.L1544:
+ str r3, [r6, #8]
+ b .L1517
+.L1516:
+ muls r4, r5, r4
+ ldr r3, [sp, #16]
+ sub r4, r4, fp
+ add r4, r3, r4, lsl #9
+ str r4, [r6, #8]
+.L1517:
+ ldr r3, .L1547+32
+ ldrb r2, [r7, #6] @ zero_extendqisi2
+ ldrh r3, [r3]
+ cmp r2, r3
+ bcc .L1526
+ movw r2, #1140
+ ldr r1, .L1547+36
+ ldr r0, .L1547+40
bl printf
-.L1488:
- ldr r3, [sp, #40]
- movw r2, #61589
+.L1526:
+ ldr r2, [sp, #40]
+ movw r3, #61589
ldr r1, [sp, #36]
- add fp, fp, #1
- strh r2, [r3, r1] @ movhi
- ldr r1, .L1508+56
+ strh r3, [r2, r1] @ movhi
+ ldr r2, .L1547+56
str r5, [r10, #8]
adds r5, r5, #1
- ldr r2, [r1]
- str r2, [r10, #4]
- adds r2, r2, #1
- adds r3, r2, #1
+ ldr r3, [r2]
+ str r3, [r10, #4]
+ adds r3, r3, #1
+ adds r1, r3, #1
it eq
- moveq r2, #0
- str r2, [r1]
- ldr r2, [sp, #48]
- str r2, [r10, #12]
- ldrh r2, [r7]
- strh r2, [r10, #2] @ movhi
- b .L1471
-.L1477:
+ moveq r3, #0
+ str r3, [r2]
+ ldr r3, [sp, #48]
+ str r3, [r10, #12]
+ ldrh r3, [r7]
+ strh r3, [r10, #2] @ movhi
+ ldr r3, [sp, #4]
+ adds r3, r3, #1
+ str r3, [sp, #4]
+ b .L1509
+.L1515:
cmp r5, r3
- add r2, r2, r6
+ ldr r3, [r8]
ite eq
- ldreq r1, .L1508+60
- ldrne r1, .L1508+64
- ldr r1, [r1]
- str r1, [r2, #8]
- ldr r2, [sp, #48]
- adds r1, r2, #1
- beq .L1482
- str r2, [sp, #56]
+ ldreq r2, .L1547+60
+ ldrne r2, .L1547+64
+ add r3, r3, r6
+ ldr r2, [r2]
+ str r2, [r3, #8]
+ ldr r3, [sp, #48]
+ adds r2, r3, #1
+ beq .L1520
+ str r3, [sp, #56]
+ movs r1, #1
+ ldr r3, [r8]
add r0, sp, #52
- ldr r2, [r8]
str r5, [sp, #68]
- add r2, r2, r6
- ldr r1, [r2, #8]
- ldr r2, [r2, #12]
- str r1, [sp, #60]
- movs r1, #1
- str r2, [sp, #64]
+ add r3, r3, r6
+ ldr r2, [r3, #8]
+ ldr r3, [r3, #12]
+ str r2, [sp, #60]
movs r2, #0
+ str r3, [sp, #64]
bl FlashReadPages
- ldr r2, [sp, #52]
- adds r2, r2, #1
- bne .L1483
- ldr r1, .L1508+68
+ ldr r3, [sp, #52]
+ adds r0, r3, #1
+ bne .L1521
+ ldr r1, .L1547+68
+ ldr r0, .L1547+72
ldr r2, [r1, #72]
adds r2, r2, #1
str r2, [r1, #72]
-.L1486:
+ mov r2, r5
+ ldr r1, [r10, #8]
+ bl printf
+.L1524:
ldr r3, [sp, #12]
lsls r2, r4, #9
cmp r5, r3
- bne .L1487
- ldr r1, [r8]
- ldr r3, [sp, #24]
- add r6, r6, r1
+ bne .L1525
+ ldr r3, [r8]
ldr r1, [sp, #16]
+ add r6, r6, r3
+ ldr r3, [sp, #24]
ldr r0, [r6, #8]
add r0, r0, r3, lsl #9
-.L1506:
+.L1545:
bl ftl_memcpy
- b .L1479
-.L1483:
+ b .L1517
+.L1521:
ldr r1, [r10, #8]
cmp r5, r1
- beq .L1485
- ldr r0, .L1508+68
- ldr r2, [r0, #72]
- adds r2, r2, #1
- str r2, [r0, #72]
+ beq .L1523
+ ldr r2, .L1547+68
+ ldr r0, .L1547+76
+ ldr r3, [r2, #72]
+ adds r3, r3, #1
+ str r3, [r2, #72]
mov r2, r5
- ldr r0, .L1508+72
bl printf
-.L1485:
- ldr r2, [r10, #8]
- cmp r5, r2
- beq .L1486
- movw r2, #1102
- ldr r1, .L1508+36
- ldr r0, .L1508+40
+.L1523:
+ ldr r3, [r10, #8]
+ cmp r5, r3
+ beq .L1524
+ movw r2, #1125
+ ldr r1, .L1547+36
+ ldr r0, .L1547+40
bl printf
- b .L1486
-.L1482:
- ldr r2, [r8]
+ b .L1524
+.L1520:
+ ldr r3, [r8]
movs r1, #0
- adds r0, r2, r6
- ldr r2, .L1508+76
- ldr r0, [r0, #8]
+ ldr r2, .L1547+80
+ add r3, r3, r6
ldrh r2, [r2]
+ ldr r0, [r3, #8]
bl ftl_memset
- b .L1486
-.L1487:
- ldr r1, .L1508+16
- ldr r3, [sp, #4]
- ldr r0, [r8]
- ldrh r1, [r1]
- add r6, r6, r0
- ldr r0, [r6, #8]
- muls r1, r5, r1
- subs r1, r1, r3
- ldr r3, [sp, #16]
- add r1, r3, r1, lsl #9
- b .L1506
-.L1509:
+ b .L1524
+.L1548:
.align 2
-.L1508:
+.L1547:
.word .LANCHOR34
.word .LANCHOR166
.word .LANCHOR176
@@ -11396,42 +11425,52 @@ FtlWrite:
.word .LANCHOR109
.word .LANCHOR110
.word .LANCHOR135
- .word .LC37
+ .word .LC44
+ .word .LC45
.word .LANCHOR23
-.L1504:
- ldrh r2, [r2]
- ldr r3, [sp, #4]
- ldr r1, [r8]
- muls r2, r5, r2
- add r6, r6, r1
- subs r2, r2, r3
+.L1525:
+ ldr r3, .L1549
+ ldrh r1, [r3]
+ ldr r3, [r8]
+ muls r1, r5, r1
+ add r6, r6, r3
ldr r3, [sp, #16]
- add r2, r3, r2, lsl #9
- str r2, [r6, #8]
- b .L1479
-.L1494:
- ldr r6, .L1510
+ ldr r0, [r6, #8]
+ sub r1, r1, fp
+ add r1, r3, r1, lsl #9
+ b .L1545
+.L1542:
+ ldr r3, [r8]
+ add r6, r6, r3
+ ldrh r3, [r2]
+ ldr r2, [sp, #16]
+ muls r3, r5, r3
+ sub r3, r3, fp
+ add r3, r2, r3, lsl #9
+ b .L1544
+.L1532:
+ ldr r6, .L1549+4
mov r4, #256
- ldr r7, .L1510+4
-.L1497:
+ ldr r7, .L1549+8
+.L1535:
ldrh r3, [r6]
movw r2, #65535
cmp r3, r2
- bne .L1495
+ bne .L1533
ldrh r2, [r7]
cmp r2, r3
- bne .L1495
+ bne .L1533
movs r0, #0
bl List_get_gc_head_node
uxth r0, r0
bl FtlGcRefreshBlock
-.L1495:
- ldr r2, .L1510+8
+.L1533:
+ ldr r2, .L1549+12
movs r3, #128
movs r1, #1
mov r0, r1
strh r3, [r2] @ movhi
- ldr r2, .L1510+12
+ ldr r2, .L1549+16
strh r3, [r2] @ movhi
bl rk_ftl_garbage_collect
movs r1, #1
@@ -11439,17 +11478,18 @@ FtlWrite:
bl rk_ftl_garbage_collect
ldrh r3, [r5]
cmp r3, #2
- bhi .L1496
+ bhi .L1534
subs r4, r4, #1
- bne .L1497
- b .L1496
-.L1498:
+ bne .L1535
+ b .L1534
+.L1536:
mov r0, #-1
- b .L1464
-.L1511:
+ b .L1502
+.L1550:
.align 2
-.L1510:
- .word .LANCHOR144
+.L1549:
+ .word .LANCHOR12
+ .word .LANCHOR145
.word .LANCHOR72
.word .LANCHOR101
.word .LANCHOR100
@@ -11483,16 +11523,16 @@ FtlLoadSysInfo:
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, r5, r6, r7, r8, r10, fp, lr}
movs r1, #0
- ldr r8, .L1540+144
+ ldr r8, .L1582+144
sub sp, sp, #24
- ldr r7, .L1540
+ ldr r7, .L1582
ldr r3, [r8]
- ldr r4, .L1540+4
- ldr fp, .L1540+148
+ ldr r4, .L1582+4
+ ldr fp, .L1582+148
ldrh r2, [r7]
- ldr r5, .L1540+8
+ ldr r5, .L1582+8
str r3, [r4, #8]
- ldr r6, .L1540+12
+ ldr r6, .L1582+12
ldr r3, [fp]
lsls r2, r2, #1
ldr r0, [r5]
@@ -11502,33 +11542,33 @@ FtlLoadSysInfo:
movw r3, #65535
str r5, [sp, #16]
cmp r0, r3
- bne .L1514
-.L1525:
+ bne .L1553
+.L1564:
mov r0, #-1
-.L1513:
+.L1552:
add sp, sp, #24
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1514:
+.L1553:
movs r1, #1
bl FtlGetLastWrittenPage
ldrsh r10, [r6]
sxth r5, r0
adds r0, r0, #1
strh r0, [r6, #2] @ movhi
-.L1516:
+.L1555:
cmp r5, #0
- bge .L1522
+ bge .L1561
movw r2, #1465
- ldr r1, .L1540+16
- ldr r0, .L1540+20
+ ldr r1, .L1582+16
+ ldr r0, .L1582+20
bl printf
- b .L1521
-.L1522:
+ b .L1560
+.L1561:
orr r3, r5, r10, lsl #10
movs r2, #1
mov r1, r2
- ldr r0, .L1540+4
+ ldr r0, .L1582+4
str r3, [r4, #4]
ldr r3, [r8]
str r3, [r4, #8]
@@ -11536,64 +11576,67 @@ FtlLoadSysInfo:
ldr r3, [r4, #12]
ldr r3, [r3, #12]
str r3, [sp, #20]
- cbz r3, .L1517
- ldr r2, .L1540+24
+ cbz r3, .L1556
+ ldr r2, [r4]
+ adds r2, r2, #1
+ beq .L1556
+ ldr r2, .L1582+24
ldr r0, [r4, #8]
ldrh r1, [r2]
bl js_hash
ldr r3, [sp, #20]
cmp r3, r0
- beq .L1517
+ beq .L1556
str r0, [sp, #8]
mov r2, r10
str r3, [sp, #4]
ldrh r3, [r6, #4]
- ldr r1, .L1540+16
- ldr r0, .L1540+28
+ ldr r1, .L1582+16
+ ldr r0, .L1582+28
str r3, [sp]
mov r3, r5
bl printf
- cbnz r5, .L1518
+ cbnz r5, .L1557
ldrh r3, [r6, #4]
cmp r10, r3
- beq .L1518
+ beq .L1557
sxth r10, r3
- ldr r3, .L1540+32
+ ldr r3, .L1582+32
ldrh r5, [r3]
-.L1520:
+.L1559:
subs r5, r5, #1
sxth r5, r5
- b .L1516
-.L1518:
+ b .L1555
+.L1557:
mov r3, #-1
str r3, [r4]
-.L1517:
+.L1556:
ldr r3, [r4]
adds r3, r3, #1
- beq .L1520
+ beq .L1559
ldr r3, [r8]
- ldr r2, .L1540+36
+ ldr r2, .L1582+36
ldr r3, [r3]
cmp r3, r2
- bne .L1520
+ bne .L1559
ldr r3, [fp]
ldrh r2, [r3]
movw r3, #61604
cmp r2, r3
- bne .L1520
-.L1521:
- ldr r2, .L1540+24
+ bne .L1559
+.L1560:
+ ldr r2, .L1582+24
ldrh r3, [r7]
ldrh r2, [r2]
adds r3, r3, #24
cmp r2, r3, lsl #1
- bcs .L1524
+ bcs .L1563
movw r2, #1467
- ldr r1, .L1540+16
- ldr r0, .L1540+20
+ ldr r1, .L1582+16
+ ldr r0, .L1582+20
bl printf
-.L1524:
- ldr r5, .L1540+40
+.L1563:
+ ldr r5, .L1582+40
movs r2, #48
ldr r1, [r4, #8]
mov r0, r5
@@ -11614,60 +11657,60 @@ FtlLoadSysInfo:
adds r2, r2, #4
bic r1, r1, #3
add r1, r1, r3
- ldr r3, .L1540+44
+ ldr r3, .L1582+44
ldr r0, [r3]
bl ftl_memcpy
ldr r2, [r5]
- ldr r3, .L1540+36
+ ldr r3, .L1582+36
cmp r2, r3
- bne .L1525
- ldr r3, .L1540+48
+ bne .L1564
+ ldr r3, .L1582+48
ldrb r2, [r4, #10] @ zero_extendqisi2
ldrh r5, [r5, #8]
ldrh r3, [r3]
strh r5, [r6, #6] @ movhi
cmp r2, r3
- bne .L1525
- ldr r3, .L1540+52
- ldr r2, .L1540+56
+ bne .L1564
+ ldr r3, .L1582+52
+ ldr r2, .L1582+56
str r5, [r3]
- ldr r3, .L1540+60
+ ldr r3, .L1582+60
ldrh r3, [r3]
muls r3, r5, r3
str r3, [r2]
- ldr r2, .L1540+64
+ ldr r2, .L1582+64
ldrh r2, [r2]
muls r3, r2, r3
- ldr r2, .L1540+68
+ ldr r2, .L1582+68
str r3, [r2]
- ldr r3, .L1540+72
+ ldr r3, .L1582+72
ldr r6, [r3]
- ldr r3, .L1540+76
+ ldr r3, .L1582+76
ldrh r0, [r3, #6]
- ldr r3, .L1540+80
+ ldr r3, .L1582+80
subs r0, r6, r0
ldrh r1, [r3]
subs r0, r0, r5
bl __aeabi_uidiv
- ldr r3, .L1540+84
+ ldr r3, .L1582+84
cmp r5, r6
strh r0, [r3] @ movhi
- bls .L1526
+ bls .L1565
movw r2, #1489
- ldr r1, .L1540+16
- ldr r0, .L1540+20
+ ldr r1, .L1582+16
+ ldr r0, .L1582+20
bl printf
-.L1526:
+.L1565:
ldrh r2, [r4, #16]
- ldr r3, .L1540+88
+ ldr r3, .L1582+88
ldrh ip, [r4, #14]
- ldr r7, .L1540+92
+ ldr r7, .L1582+92
lsrs r1, r2, #6
and r2, r2, #63
strb r2, [r3, #6]
ldrb r2, [r4, #11] @ zero_extendqisi2
strh r1, [r3, #2] @ movhi
- ldr r1, .L1540+96
+ ldr r1, .L1582+96
strb r2, [r3, #8]
ldrh r2, [r4, #18]
strh ip, [r3] @ movhi
@@ -11686,7 +11729,7 @@ FtlLoadSysInfo:
strh r5, [r1, #2] @ movhi
ldrh r5, [r4, #22]
strb r2, [r1, #8]
- ldr r2, .L1540+100
+ ldr r2, .L1582+100
strh r5, [r2] @ movhi
ldrh r5, [r4, #24]
lsrs r6, r5, #6
@@ -11696,31 +11739,31 @@ FtlLoadSysInfo:
strh r6, [r2, #2] @ movhi
ldr r6, [r4, #32]
strb r5, [r2, #8]
- ldr r5, .L1540+104
+ ldr r5, .L1582+104
str r3, [r5]
- ldr r5, .L1540+108
+ ldr r5, .L1582+108
str r3, [r5]
- ldr r5, .L1540+112
+ ldr r5, .L1582+112
str r3, [r5]
- ldr r5, .L1540+116
+ ldr r5, .L1582+116
str r3, [r5]
- ldr r5, .L1540+120
+ ldr r5, .L1582+120
str r6, [r5]
mov r6, r1
- ldr r5, .L1540+124
+ ldr r5, .L1582+124
str r3, [r5]
- ldr r5, .L1540+128
+ ldr r5, .L1582+128
str r3, [r5]
- ldr r5, .L1540+132
+ ldr r5, .L1582+132
ldr lr, [r4, #40]
str r3, [r5]
- ldr r3, .L1540+136
+ ldr r3, .L1582+136
ldr r5, [r3]
cmp lr, r5
mov r5, r2
it hi
strhi lr, [r3]
- ldr r3, .L1540+140
+ ldr r3, .L1582+140
ldr r2, [r4, #36]
ldr r1, [r3]
cmp r2, r1
@@ -11728,36 +11771,36 @@ FtlLoadSysInfo:
strhi r2, [r3]
movw r3, #65535
cmp ip, r3
- beq .L1529
- ldr r0, .L1540+88
+ beq .L1568
+ ldr r0, .L1582+88
bl make_superblock
-.L1529:
+.L1568:
ldrh r2, [r6]
movw r3, #65535
cmp r2, r3
- beq .L1530
- ldr r0, .L1540+96
+ beq .L1569
+ ldr r0, .L1582+96
bl make_superblock
-.L1530:
+.L1569:
ldrh r2, [r5]
movw r3, #65535
cmp r2, r3
- beq .L1531
- ldr r0, .L1540+100
+ beq .L1570
+ ldr r0, .L1582+100
bl make_superblock
-.L1531:
+.L1570:
ldrh r2, [r7]
movw r3, #65535
cmp r2, r3
- beq .L1532
- ldr r0, .L1540+92
+ beq .L1571
+ ldr r0, .L1582+92
bl make_superblock
-.L1532:
+.L1571:
movs r0, #0
- b .L1513
-.L1541:
+ b .L1552
+.L1583:
.align 2
-.L1540:
+.L1582:
.word .LANCHOR5
.word .LANCHOR138
.word .LANCHOR42
@@ -11765,7 +11808,7 @@ FtlLoadSysInfo:
.word .LANCHOR178
.word .LC1
.word .LANCHOR23
- .word .LC38
+ .word .LC46
.word .LANCHOR20
.word 1179929683
.word .LANCHOR39
@@ -11781,7 +11824,7 @@ FtlLoadSysInfo:
.word .LANCHOR3
.word .LANCHOR171
.word .LANCHOR51
- .word .LANCHOR144
+ .word .LANCHOR145
.word .LANCHOR52
.word .LANCHOR53
.word .LANCHOR84
@@ -11817,7 +11860,7 @@ FtlMapTblRecovery:
movs r7, #0
str r3, [sp, #8]
ldr r3, [r0, #16]
- ldr r6, .L1577
+ ldr r6, .L1625
str r3, [sp, #24]
ldrh r3, [r0, #6]
str r3, [sp, #12]
@@ -11827,13 +11870,13 @@ FtlMapTblRecovery:
ldr r3, [sp, #12]
lsls r2, r3, #2
bl ftl_memset
- ldr r3, .L1577+4
+ ldr r3, .L1625+4
str r7, [r4, #32]
str r7, [r4, #28]
ldr r2, [r3]
str r3, [sp, #20]
str r2, [r6, #8]
- ldr r2, .L1577+8
+ ldr r2, .L1625+8
ldr fp, [r2]
movw r2, #65535
str fp, [r6, #12]
@@ -11841,20 +11884,20 @@ FtlMapTblRecovery:
strh r2, [r4, #2] @ movhi
movs r2, #1
str r2, [r4, #36]
-.L1543:
+.L1585:
ldr r3, [sp, #16]
sxth r5, r7
cmp r5, r3
- bge .L1562
+ bge .L1604
ldr r3, [sp, #16]
subs r3, r3, #1
cmp r5, r3
- bne .L1544
+ bne .L1586
movs r1, #1
ldrh r0, [r8, r5, lsl #1]
bl FtlGetLastWrittenPage
sxth r3, r0
- ldr r6, .L1577
+ ldr r6, .L1625
add r10, r8, r5, lsl #1
strh r7, [r4] @ movhi
str r3, [sp, #16]
@@ -11864,22 +11907,22 @@ FtlMapTblRecovery:
strh r0, [r4, #2] @ movhi
ldr r3, [r3, r5, lsl #2]
str r3, [r4, #28]
-.L1545:
+.L1587:
ldr r3, [sp, #16]
sxth r8, r7
cmp r8, r3
- ble .L1548
-.L1562:
+ ble .L1590
+.L1604:
mov r0, r4
bl ftl_free_no_use_map_blk
- ldr r3, .L1577+12
+ ldr r3, .L1625+12
ldrh r2, [r4, #2]
ldrh r3, [r3]
cmp r2, r3
- bne .L1550
+ bne .L1592
mov r0, r4
bl ftl_map_blk_alloc_new_blk
-.L1550:
+.L1592:
mov r0, r4
bl ftl_map_blk_gc
mov r0, r4
@@ -11888,9 +11931,9 @@ FtlMapTblRecovery:
add sp, sp, #40
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1548:
+.L1590:
ldrh r2, [r10]
- ldr r0, .L1577
+ ldr r0, .L1625
orr r2, r8, r2, lsl #10
str r2, [r6, #4]
movs r2, #1
@@ -11899,31 +11942,34 @@ FtlMapTblRecovery:
ldr r2, [r6, #12]
ldr r2, [r2, #12]
str r2, [sp, #20]
- cbz r2, .L1546
- ldr r3, .L1577+16
+ cbz r2, .L1588
+ ldr r1, [r6]
+ adds r1, r1, #1
+ beq .L1588
+ ldr r3, .L1625+16
ldr r0, [r6, #8]
ldrh r1, [r3]
bl js_hash
ldr r2, [sp, #20]
cmp r2, r0
- beq .L1546
+ beq .L1588
str r0, [sp, #4]
mov r3, r8
str r2, [sp]
mov r2, r5
- ldr r1, .L1577+20
- ldr r0, .L1577+24
+ ldr r1, .L1625+20
+ ldr r0, .L1625+24
bl printf
mov r3, #-1
str r3, [r6]
-.L1546:
+.L1588:
ldr r3, [r6]
adds r3, r3, #1
- beq .L1547
+ beq .L1589
ldrh r3, [fp, #8]
ldr r2, [sp, #12]
cmp r2, r3
- bls .L1547
+ bls .L1589
ldrh r1, [fp]
ldrh r2, [r4, #4]
cmp r1, r2
@@ -11931,15 +11977,15 @@ FtlMapTblRecovery:
ldreq r2, [r6, #4]
ldreq r1, [sp, #8]
streq r2, [r1, r3, lsl #2]
-.L1547:
+.L1589:
adds r7, r7, #1
- b .L1545
-.L1544:
+ b .L1587
+.L1586:
ldr r3, [sp, #20]
- ldr r10, .L1577+12
+ ldr r10, .L1625+12
ldrh r2, [r8, r5, lsl #1]
ldr r3, [r3]
- ldr r0, .L1577
+ ldr r0, .L1625
str r3, [r6, #8]
add r3, r8, r5, lsl #1
str r3, [sp, #28]
@@ -11952,25 +11998,25 @@ FtlMapTblRecovery:
bl FlashReadPages
ldr r3, [r6]
adds r3, r3, #1
- beq .L1564
+ beq .L1606
ldrh r2, [fp]
ldrh r3, [r4, #4]
cmp r2, r3
- bne .L1564
+ bne .L1606
ldrh r2, [fp, #8]
movw r3, #64245
cmp r2, r3
- beq .L1552
-.L1564:
+ beq .L1594
+.L1606:
mov r10, #0
-.L1553:
- ldr r2, .L1577+12
+.L1595:
+ ldr r2, .L1625+12
sxth r3, r10
ldrh r2, [r2]
cmp r3, r2
- bge .L1560
+ bge .L1602
ldr r2, [sp, #28]
- ldr r0, .L1577
+ ldr r0, .L1625
str r3, [sp, #36]
ldrh r2, [r2]
orr r2, r3, r2, lsl #10
@@ -11981,31 +12027,34 @@ FtlMapTblRecovery:
ldr r2, [r6, #12]
ldr r2, [r2, #12]
str r2, [sp, #32]
- cbz r2, .L1557
- ldr r1, .L1577+16
+ cbz r2, .L1599
+ ldr r1, [r6]
+ adds r1, r1, #1
+ beq .L1599
+ ldr r1, .L1625+16
ldr r0, [r6, #8]
ldrh r1, [r1]
bl js_hash
ldr r2, [sp, #32]
cmp r2, r0
- beq .L1557
+ beq .L1599
str r0, [sp, #4]
str r2, [sp]
mov r2, r5
ldr r3, [sp, #36]
- ldr r1, .L1577+20
- ldr r0, .L1577+28
+ ldr r1, .L1625+20
+ ldr r0, .L1625+28
bl printf
mov r3, #-1
str r3, [r6]
-.L1557:
+.L1599:
ldr r3, [r6]
adds r3, r3, #1
- beq .L1558
+ beq .L1600
ldrh r3, [fp, #8]
ldr r2, [sp, #12]
cmp r2, r3
- bls .L1558
+ bls .L1600
ldrh r1, [fp]
ldrh r2, [r4, #4]
cmp r1, r2
@@ -12013,47 +12062,47 @@ FtlMapTblRecovery:
ldreq r2, [r6, #4]
ldreq r1, [sp, #8]
streq r2, [r1, r3, lsl #2]
-.L1558:
+.L1600:
add r10, r10, #1
- b .L1553
-.L1552:
+ b .L1595
+.L1594:
ldr r3, [sp, #20]
movs r1, #0
ldrh r2, [r10]
ldr r0, [r3]
add lr, r2, #-1
-.L1554:
+.L1596:
sxth r3, r1
cmp r3, lr
- blt .L1556
-.L1560:
+ blt .L1598
+.L1602:
adds r7, r7, #1
- b .L1543
-.L1556:
+ b .L1585
+.L1598:
lsls r5, r3, #3
ldr r3, [r0, r3, lsl #3]
ldr r2, [sp, #12]
uxth ip, r3
cmp r2, ip
- bls .L1555
+ bls .L1597
add r5, r5, r0
ldr r2, [sp, #8]
ldr r5, [r5, #4]
str r5, [r2, ip, lsl #2]
-.L1555:
+.L1597:
adds r1, r1, #1
- b .L1554
-.L1578:
+ b .L1596
+.L1626:
.align 2
-.L1577:
+.L1625:
.word .LANCHOR138
.word .LANCHOR106
.word .LANCHOR114
.word .LANCHOR20
.word .LANCHOR23
.word .LANCHOR180
- .word .LC39
- .word .LC40
+ .word .LC47
+ .word .LC48
.size FtlMapTblRecovery, .-FtlMapTblRecovery
.section .text.FtlLoadVonderInfo,"ax",%progbits
.align 1
@@ -12067,36 +12116,36 @@ FtlLoadVonderInfo:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, lr}
- ldr r3, .L1580
- ldr r0, .L1580+4
+ ldr r3, .L1628
+ ldr r0, .L1628+4
ldrh r3, [r3]
strh r3, [r0, #10] @ movhi
movw r3, #61574
strh r3, [r0, #4] @ movhi
- ldr r3, .L1580+8
+ ldr r3, .L1628+8
ldrh r3, [r3]
strh r3, [r0, #8] @ movhi
- ldr r3, .L1580+12
+ ldr r3, .L1628+12
ldrh r3, [r3]
strh r3, [r0, #6] @ movhi
- ldr r3, .L1580+16
+ ldr r3, .L1628+16
ldr r3, [r3]
str r3, [r0, #12]
- ldr r3, .L1580+20
+ ldr r3, .L1628+20
ldr r3, [r3]
str r3, [r0, #16]
- ldr r3, .L1580+24
+ ldr r3, .L1628+24
ldr r3, [r3]
str r3, [r0, #20]
- ldr r3, .L1580+28
+ ldr r3, .L1628+28
ldr r3, [r3]
str r3, [r0, #24]
bl FtlMapTblRecovery
movs r0, #0
pop {r3, pc}
-.L1581:
+.L1629:
.align 2
-.L1580:
+.L1628:
.word .LANCHOR27
.word .LANCHOR161
.word .LANCHOR35
@@ -12119,13 +12168,13 @@ FtlLoadMapInfo:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, lr}
bl FtlL2PDataInit
- ldr r0, .L1583
+ ldr r0, .L1631
bl FtlMapTblRecovery
movs r0, #0
pop {r3, pc}
-.L1584:
+.L1632:
.align 2
-.L1583:
+.L1631:
.word .LANCHOR129
.size FtlLoadMapInfo, .-FtlLoadMapInfo
.section .text.FtlSysBlkInit,"ax",%progbits
@@ -12141,27 +12190,27 @@ FtlSysBlkInit:
@ frame_needed = 0, uses_anonymous_args = 0
push {r3, r4, r5, r6, r7, lr}
movs r3, #0
- ldr r4, .L1598
+ ldr r4, .L1646
strh r3, [r4] @ movhi
- ldr r3, .L1598+4
+ ldr r3, .L1646+4
ldrh r0, [r3]
bl FtlFreeSysBlkQueueInit
bl FtlScanSysBlk
- ldr r3, .L1598+8
+ ldr r3, .L1646+8
ldrh r2, [r3]
movw r3, #65535
cmp r2, r3
- bne .L1586
-.L1588:
+ bne .L1634
+.L1636:
mov r6, #-1
-.L1585:
+.L1633:
mov r0, r6
pop {r3, r4, r5, r6, r7, pc}
-.L1586:
+.L1634:
bl FtlLoadSysInfo
mov r6, r0
cmp r0, #0
- bne .L1588
+ bne .L1636
bl FtlLoadMapInfo
bl FtlLoadVonderInfo
bl Ftl_load_ext_data
@@ -12171,40 +12220,40 @@ FtlSysBlkInit:
bl FtlPowerLostRecovery
movs r0, #1
bl FtlUpdateVaildLpn
- ldr r3, .L1598+12
+ ldr r3, .L1646+12
movs r0, #12
ldrh r1, [r3]
- ldr r3, .L1598+16
+ ldr r3, .L1646+16
ldr r2, [r3]
mov r3, r6
-.L1589:
+.L1637:
cmp r3, r1
- bge .L1594
+ bge .L1642
mla r5, r0, r3, r2
ldr r5, [r5, #4]
cmp r5, #0
- bge .L1590
-.L1594:
- ldr r0, .L1598+20
+ bge .L1638
+.L1642:
+ ldr r0, .L1646+20
cmp r3, r1
ldr r2, [r0]
add r2, r2, #32
str r2, [r0]
- bge .L1596
-.L1591:
- ldr r5, .L1598+24
- ldr r4, .L1598+28
+ bge .L1644
+.L1639:
+ ldr r5, .L1646+24
+ ldr r4, .L1646+28
mov r0, r5
bl FtlSuperblockPowerLostFix
mov r0, r4
bl FtlSuperblockPowerLostFix
- ldr r3, .L1598+32
+ ldr r3, .L1646+32
ldrh r1, [r5]
ldrh r0, [r5, #4]
ldr r2, [r3]
ldrh r3, [r2, r1, lsl #1]
subs r3, r3, r0
- ldr r0, .L1598+36
+ ldr r0, .L1646+36
strh r3, [r2, r1, lsl #1] @ movhi
ldrh r7, [r4, #4]
ldrh r3, [r0]
@@ -12220,27 +12269,27 @@ FtlSysBlkInit:
strb r3, [r4, #6]
strh r3, [r4, #4] @ movhi
strh r2, [r4, #2] @ movhi
- ldr r2, .L1598+40
+ ldr r2, .L1646+40
ldrh r3, [r2, #30]
adds r3, r3, #1
strh r3, [r2, #30] @ movhi
bl l2p_flush
bl FtlVpcTblFlush
-.L1597:
+.L1645:
bl FtlVpcTblFlush
- b .L1585
-.L1590:
+ b .L1633
+.L1638:
adds r3, r3, #1
- b .L1589
-.L1596:
+ b .L1637
+.L1644:
ldrh r3, [r4]
cmp r3, #0
- bne .L1591
+ bne .L1639
bl l2p_flush
- b .L1597
-.L1599:
+ b .L1645
+.L1647:
.align 2
-.L1598:
+.L1646:
.word .LANCHOR156
.word .LANCHOR4
.word .LANCHOR139
@@ -12266,62 +12315,64 @@ ftl_low_format:
@ frame_needed = 0, uses_anonymous_args = 0
push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r10, fp, lr}
movs r3, #0
- ldr r6, .L1624
- ldr r2, .L1624+4
- ldr r5, .L1624+8
- ldrh r0, [r6]
+ ldr r2, .L1672
+ ldr r6, .L1672+4
str r3, [r2]
+ ldr r5, .L1672+8
+ ldr r2, .L1672+12
+ ldrh r0, [r6]
str r3, [r5]
+ str r3, [r2]
bl FtlFreeSysBlkQueueInit
bl FtlLoadBbt
- cbz r0, .L1601
+ cbz r0, .L1649
bl FtlMakeBbt
-.L1601:
- ldr r3, .L1624+12
- ldr r2, .L1624+16
- ldr ip, .L1624+100
+.L1649:
+ ldr r3, .L1672+16
+ ldr r2, .L1672+20
+ ldr ip, .L1672+104
ldrh r1, [r3]
ldr r4, [r2]
- ldr r2, .L1624+20
+ ldr r2, .L1672+24
str r3, [sp, #4]
lsls r1, r1, #7
ldr r7, [r2]
movs r2, #0
-.L1602:
+.L1650:
uxth r3, r2
adds r2, r2, #1
cmp r3, r1
- blt .L1603
- ldr r3, .L1624+24
+ blt .L1651
+ ldr r3, .L1672+28
movs r7, #0
- ldr r10, .L1624+104
+ ldr r10, .L1672+108
ldrh r4, [r3]
mov r8, r3
mov fp, r10
-.L1604:
+.L1652:
ldrh r3, [r10]
cmp r3, r4
- bhi .L1605
- ldr r4, .L1624+28
+ bhi .L1653
+ ldr r4, .L1672+32
subs r3, r7, #2
ldrh r1, [r4]
cmp r3, r1, lsl #1
- bgt .L1606
-.L1610:
+ bgt .L1654
+.L1658:
movs r6, #0
mov r7, r6
-.L1607:
+.L1655:
ldrh r3, [r8]
uxth r0, r6
adds r6, r6, #1
cmp r3, r0
- bhi .L1611
+ bhi .L1659
ldrh r2, [fp]
- ldr r3, .L1624+32
+ ldr r3, .L1672+36
ldrh r4, [r4]
- ldr r6, .L1624+36
+ ldr r6, .L1672+40
str r2, [r3]
- ldr r3, .L1624+40
+ ldr r3, .L1672+44
mov r1, r4
ldr r2, [r3]
mov r0, r2
@@ -12331,13 +12382,13 @@ ftl_low_format:
mov r3, r0
str r0, [r6]
add r1, r10, #36
- ldr r0, .L1624+44
+ ldr r0, .L1672+48
strh r1, [r0] @ movhi
movs r1, #24
muls r1, r4, r1
str r0, [sp]
cmp r7, r1
- ble .L1612
+ ble .L1660
ldr r2, [sp, #12]
mov r1, r4
str r3, [sp, #8]
@@ -12349,11 +12400,11 @@ ftl_low_format:
adds r0, r0, #24
strh r0, [r3] @ movhi
ldr r3, [sp, #8]
-.L1612:
- ldr r2, .L1624+48
+.L1660:
+ ldr r2, .L1672+52
ldrh r2, [r2]
- cbz r2, .L1614
- ldr r1, .L1624+44
+ cbz r2, .L1662
+ ldr r1, .L1672+48
ldrh r0, [r1]
add r0, r0, r2, lsr #1
strh r0, [r1] @ movhi
@@ -12364,24 +12415,24 @@ ftl_low_format:
strlt r3, [r6]
addlt r2, r2, r10
strhlt r2, [r1] @ movhi
-.L1614:
+.L1662:
ldr r3, [sp]
- ldr r7, .L1624+52
- ldr r10, .L1624+108
+ ldr r7, .L1672+56
+ ldr r10, .L1672+112
ldrh r2, [r3]
ldr r3, [r6]
subs r3, r3, r2
muls r4, r3, r4
- ldr r3, .L1624+56
+ ldr r3, .L1672+60
ldrh r3, [r3]
str r4, [r7]
muls r4, r3, r4
ldr r3, [sp, #4]
ldrh r3, [r3]
str r4, [r6]
- ldr r6, .L1624+60
+ ldr r6, .L1672+64
muls r4, r3, r4
- ldr r3, .L1624+64
+ ldr r3, .L1672+68
str r4, [r3]
movw r4, #65535
bl FtlBbmTblFlush
@@ -12390,13 +12441,13 @@ ftl_low_format:
ldr r0, [r10]
lsls r2, r2, #1
bl ftl_memset
- ldr r2, .L1624+68
+ ldr r2, .L1672+72
movs r3, #0
strh r3, [r6, #2] @ movhi
movs r1, #255
strb r3, [r6, #6]
str r3, [r2]
- ldr r2, .L1624+72
+ ldr r2, .L1672+76
strh r3, [r6] @ movhi
strh r3, [r2, #2] @ movhi
strb r3, [r2, #6]
@@ -12407,30 +12458,30 @@ ftl_low_format:
mov r8, r10
strb r3, [r6, #8]
mov r10, r6
- ldr r3, .L1624+76
+ ldr r3, .L1672+80
lsrs r2, r2, #3
ldr r0, [r3]
bl ftl_memset
-.L1616:
+.L1664:
mov r0, r10
bl make_superblock
ldrb r3, [r6, #7] @ zero_extendqisi2
ldrh r2, [r6]
cmp r3, #0
- bne .L1617
+ bne .L1665
ldr r3, [r8]
strh r4, [r3, r2, lsl #1] @ movhi
ldrh r3, [r6]
adds r3, r3, #1
strh r3, [r6] @ movhi
- b .L1616
-.L1603:
+ b .L1664
+.L1651:
mvns r0, r3
orr r0, r3, r0, lsl #16
str r0, [r4, r3, lsl #2]
str ip, [r7, r3, lsl #2]
- b .L1602
-.L1605:
+ b .L1650
+.L1653:
mov r0, r4
movs r1, #1
bl FtlLowFormatEraseBlock
@@ -12438,11 +12489,11 @@ ftl_low_format:
add r7, r7, r0
uxth r7, r7
uxth r4, r4
- b .L1604
-.L1606:
+ b .L1652
+.L1654:
mov r0, r7
bl __aeabi_uidiv
- ldr r3, .L1624+80
+ ldr r3, .L1672+84
ldr r3, [r3]
add r0, r0, r3
uxth r0, r0
@@ -12450,26 +12501,26 @@ ftl_low_format:
ldrh r0, [r6]
bl FtlFreeSysBlkQueueInit
ldrh r6, [r8]
-.L1608:
+.L1656:
ldrh r3, [fp]
cmp r3, r6
- bls .L1610
+ bls .L1658
mov r0, r6
movs r1, #1
adds r6, r6, #1
bl FtlLowFormatEraseBlock
uxth r6, r6
- b .L1608
-.L1611:
+ b .L1656
+.L1659:
movs r1, #0
bl FtlLowFormatEraseBlock
add r7, r7, r0
uxth r7, r7
- b .L1607
-.L1617:
+ b .L1655
+.L1665:
ldr r3, [r5]
ldrh r1, [r6, #4]
- ldr r4, .L1624+84
+ ldr r4, .L1672+88
str r3, [r6, #12]
adds r3, r3, #1
str r3, [r5]
@@ -12485,19 +12536,19 @@ ftl_low_format:
strh r3, [r4] @ movhi
movs r3, #1
strb r3, [r4, #8]
-.L1618:
+.L1666:
mov r0, r10
bl make_superblock
ldrb r3, [r4, #7] @ zero_extendqisi2
ldrh r2, [r4]
- cbnz r3, .L1619
+ cbnz r3, .L1667
ldr r3, [r8]
strh r6, [r3, r2, lsl #1] @ movhi
ldrh r3, [r4]
adds r3, r3, #1
strh r3, [r4] @ movhi
- b .L1618
-.L1619:
+ b .L1666
+.L1667:
ldr r3, [r5]
ldrh r1, [r4, #4]
str r3, [r4, #12]
@@ -12506,10 +12557,10 @@ ftl_low_format:
movw r4, #65535
ldr r3, [r8]
strh r1, [r3, r2, lsl #1] @ movhi
- ldr r3, .L1624+88
+ ldr r3, .L1672+92
strh r4, [r3] @ movhi
bl FtlFreeSysBlkQueueOut
- ldr r3, .L1624+92
+ ldr r3, .L1672+96
movs r2, #0
strh r2, [r3, #2] @ movhi
ldr r2, [r7]
@@ -12522,21 +12573,22 @@ ftl_low_format:
str r2, [r5]
bl FtlVpcTblFlush
bl FtlSysBlkInit
- cbnz r0, .L1620
- ldr r3, .L1624+96
+ cbnz r0, .L1668
+ ldr r3, .L1672+100
movs r2, #1
str r2, [r3]
-.L1620:
+.L1668:
movs r0, #0
add sp, sp, #16
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1625:
+.L1673:
.align 2
-.L1624:
- .word .LANCHOR4
+.L1672:
.word .LANCHOR83
+ .word .LANCHOR4
.word .LANCHOR82
+ .word .LANCHOR143
.word .LANCHOR12
.word .LANCHOR109
.word .LANCHOR110
@@ -12552,7 +12604,7 @@ ftl_low_format:
.word .LANCHOR51
.word .LANCHOR34
.word .LANCHOR59
- .word .LANCHOR144
+ .word .LANCHOR145
.word .LANCHOR1
.word .LANCHOR31
.word .LANCHOR52
@@ -12576,60 +12628,46 @@ sftl_init:
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, r5, r6, lr}
mov r3, #-1
- ldr r4, .L1643
+ ldr r4, .L1686
movs r6, #0
- ldr r1, .L1643+4
- ldr r0, .L1643+8
+ ldr r1, .L1686+4
+ ldr r0, .L1686+8
str r3, [r4]
bl printf
- ldr r0, .L1643+12
+ ldr r0, .L1686+12
bl FtlConstantsInit
- ldr r5, .L1643+16
+ ldr r5, .L1686+16
bl FtlMemInit
bl FtlVariablesInit
- ldr r3, .L1643+20
+ ldr r3, .L1686+20
ldrh r0, [r3]
bl FtlFreeSysBlkQueueInit
-.L1627:
+.L1675:
bl FtlLoadBbt
- cbz r0, .L1628
-.L1642:
+ cbz r0, .L1676
+.L1685:
ldr r3, [r5]
cmp r3, #1
- bne .L1627
+ bne .L1675
str r6, [r5]
bl ftl_low_format
- b .L1627
-.L1628:
+ b .L1675
+.L1676:
bl FtlSysBlkInit
cmp r0, #0
- bne .L1642
+ bne .L1685
movs r3, #1
str r3, [r4]
- ldr r3, .L1643+24
- ldrh r3, [r3]
- cmp r3, #15
- bhi .L1640
- movw r4, #8129
-.L1634:
- movs r1, #1
- movs r0, #0
- bl rk_ftl_garbage_collect
- subs r4, r4, #1
- bne .L1634
-.L1640:
- movs r0, #0
pop {r4, r5, r6, pc}
-.L1644:
+.L1687:
.align 2
-.L1643:
+.L1686:
.word .LANCHOR166
- .word .LC41
- .word .LC34
+ .word .LC49
+ .word .LC38
.word .LANCHOR0
.word .LANCHOR181
.word .LANCHOR4
- .word .LANCHOR48
.size sftl_init, .-sftl_init
.section .text.FtlWriteToIDB,"ax",%progbits
.align 1
@@ -12650,33 +12688,33 @@ FtlWriteToIDB:
mov r4, r0
mov r6, r1
mov r7, r2
- ldr r5, .L1715
- bls .L1646
+ ldr r5, .L1758
+ bls .L1689
cmp r0, #576
- bcc .L1647
-.L1646:
+ bcc .L1690
+.L1689:
ldr r3, [r5]
- cbnz r3, .L1648
-.L1714:
+ cbnz r3, .L1691
+.L1757:
movs r4, #0
- b .L1645
-.L1648:
- ldr r3, .L1715+4
+ b .L1688
+.L1691:
+ ldr r3, .L1758+4
ldr r3, [r3]
ldr r2, [r3]
str r3, [sp, #12]
- ldr r3, .L1715+8
+ ldr r3, .L1758+8
cmp r2, r3
- bne .L1650
- ldr r3, .L1715+12
+ bne .L1693
+ ldr r3, .L1758+12
movs r2, #0
ldrh r1, [r3, #10]
ldr r3, [sp, #12]
add r0, r3, #262144
movw r3, #65535
-.L1654:
+.L1697:
ldr r4, [r0, #-4]
- cbnz r4, .L1651
+ cbnz r4, .L1694
ldr r4, [sp, #12]
subs r3, r3, #1
ldr r4, [r4, r2, lsl #2]
@@ -12686,18 +12724,18 @@ FtlWriteToIDB:
movhi r2, #0
cmp r3, #4096
str r4, [r0, #-4]!
- bne .L1654
+ bne .L1697
mov r3, #512
- b .L1711
-.L1651:
+ b .L1754
+.L1694:
adds r3, r3, #127
lsrs r3, r3, #7
-.L1711:
+.L1754:
str r3, [sp, #16]
lsls r1, r1, #2
ldr r3, [sp, #16]
uxth r1, r1
- ldr r4, .L1715+16
+ ldr r4, .L1758+16
adds r0, r3, #4
bl __aeabi_uidiv
adds r3, r0, #1
@@ -12708,53 +12746,53 @@ FtlWriteToIDB:
movs r3, #0
mov r10, r3
str r3, [sp, #20]
-.L1676:
- ldr r3, .L1715+20
+.L1719:
+ ldr r3, .L1758+20
mov r2, #512
movs r1, #0
ldr r0, [r3]
bl memset
- ldr r3, .L1715+12
+ ldr r3, .L1758+12
ldrh r6, [r3, #10]
ldr r3, [r4, #16]
mul fp, r10, r6
cmp r3, #0
- beq .L1684
+ beq .L1727
ldr r3, [r4, #20]
cmp r3, #0
ite eq
moveq r3, #6
movne r3, #9
-.L1712:
+.L1755:
str r3, [sp, #28]
mov r1, fp
- ldr r3, .L1715+16
+ ldr r3, .L1758+16
movs r0, #0
ldr r3, [r3, #4]
blx r3
ldr r3, [sp, #24]
cmp r3, #1
- beq .L1656
- ldr r3, .L1715+16
+ beq .L1699
+ ldr r3, .L1758+16
add r1, r6, fp
movs r0, #0
ldr r3, [r3, #4]
blx r3
-.L1656:
+.L1699:
ldr r3, [sp, #28]
cmp r3, #9
- bne .L1686
- ldr r3, .L1715+20
+ bne .L1729
+ ldr r3, .L1758+20
mov r2, #1024
movs r1, #0
ldr r5, [r3]
mov r0, r5
bl ftl_memset
movs r2, #4
- ldr r3, .L1715+24
+ ldr r3, .L1758+24
strb r2, [r5, #17]
movs r1, #12
- ldr r2, .L1715+12
+ ldr r2, .L1758+12
adds r0, r5, r1
str r3, [r5]
movs r3, #0
@@ -12769,7 +12807,7 @@ FtlWriteToIDB:
strh r3, [r5, #22] @ movhi
bl js_hash
str r0, [r5, #8]
-.L1657:
+.L1700:
ldr r3, [sp, #24]
mov r8, fp
muls r3, r6, r3
@@ -12777,10 +12815,10 @@ FtlWriteToIDB:
str r3, [sp, #40]
ldr r3, [sp, #12]
str r3, [sp, #32]
-.L1658:
+.L1701:
ldr r3, [sp, #40]
cmp r6, r3
- beq .L1665
+ beq .L1708
ldr r3, [sp, #28]
cmp r3, #9
itet ne
@@ -12791,10 +12829,10 @@ FtlWriteToIDB:
movw r3, #61424
str r3, [sp, #52]
cmp r6, #0
- bne .L1661
+ bne .L1704
ldr r3, [sp, #28]
cmp r3, #9
- bne .L1661
+ bne .L1704
ldr r3, [r4, #16]
movs r0, #70
blx r3
@@ -12804,40 +12842,40 @@ FtlWriteToIDB:
mov r0, r6
ldr r7, [r4, #8]
blx r7
- ldr r2, .L1715+12
+ ldr r2, .L1758+12
str r0, [sp, #44]
ldr r3, [r4, #16]
ldrb r0, [r2, #22] @ zero_extendqisi2
blx r3
ldr r2, [sp, #44]
adds r2, r2, #1
- bne .L1662
-.L1665:
- ldr r3, .L1715+20
+ bne .L1705
+.L1708:
+ ldr r3, .L1758+20
ldr r2, [r4, #16]
ldr r6, [r3]
- ldr r3, .L1715+12
+ ldr r3, .L1758+12
ldrb r3, [r3, #14] @ zero_extendqisi2
str r3, [sp, #28]
- ldr r3, .L1715+12
+ ldr r3, .L1758+12
ldrh r3, [r3, #10]
mul r8, r10, r3
cmp r2, #0
- bne .L1663
+ bne .L1706
mov fp, #6
-.L1664:
+.L1707:
ldr r2, [sp, #24]
movs r5, #0
muls r3, r2, r3
str r3, [sp, #32]
-.L1667:
+.L1710:
ldr r3, [sp, #32]
cmp r5, r3
- beq .L1671
+ beq .L1714
cmp r5, #0
- bne .L1668
+ bne .L1711
cmp fp, #9
- bne .L1668
+ bne .L1711
ldr r3, [r4, #16]
movs r0, #70
blx r3
@@ -12853,77 +12891,77 @@ FtlWriteToIDB:
ldr r3, [r4, #20]
ldr r0, [sp, #28]
blx r3
- ldr r2, .L1715+12
+ ldr r2, .L1758+12
ldr r3, [r4, #16]
ldrb r0, [r2, #22] @ zero_extendqisi2
blx r3
ldr r3, [r6]
- ldr r2, .L1715+24
+ ldr r2, .L1758+24
cmp r3, r2
- beq .L1669
-.L1671:
- ldr r3, .L1715+20
+ beq .L1712
+.L1714:
+ ldr r3, .L1758+20
movs r5, #0
ldr r1, [sp, #12]
ldr r0, [r3]
-.L1670:
+.L1713:
mov r8, r1
ldr r2, [r0, r5, lsl #2]
ldr r3, [r8]
lsls r6, r5, #2
adds r1, r1, #4
cmp r2, r3
- beq .L1673
+ beq .L1716
mov r2, #512
movs r1, #0
bl memset
- ldr r3, .L1715+20
+ ldr r3, .L1758+20
mov r1, r10
- ldr r0, .L1715+28
+ ldr r0, .L1758+28
ldr r2, [r3]
str r5, [sp]
ldr r3, [r8]
ldr r2, [r2, r6]
bl printf
- ldr r3, .L1715+12
+ ldr r3, .L1758+12
movs r0, #0
ldrh r1, [r3, #10]
ldr r3, [r4, #4]
mul r1, r10, r1
blx r3
-.L1674:
+.L1717:
ldr r3, [sp, #24]
add r10, r10, r3
cmp r10, #15
- bls .L1676
+ bls .L1719
ldr r3, [sp, #20]
- cbnz r3, .L1677
-.L1650:
+ cbnz r3, .L1720
+.L1693:
mov r3, #-1
str r3, [sp, #16]
-.L1677:
- ldr r3, .L1715
+.L1720:
+ ldr r3, .L1758
movs r2, #0
ldr r4, [sp, #16]
str r2, [r3]
- ldr r3, .L1715+4
+ ldr r3, .L1758+4
ldr r0, [r3]
bl free
- ldr r3, .L1715+20
+ ldr r3, .L1758+20
ldr r0, [r3]
bl free
-.L1645:
+.L1688:
mov r0, r4
add sp, sp, #112
@ sp needed
pop {r4, r5, r6, r7, r8, r10, fp, pc}
-.L1684:
+.L1727:
movs r3, #6
- b .L1712
-.L1686:
+ b .L1755
+.L1729:
movs r5, #0
- b .L1657
-.L1661:
+ b .L1700
+.L1704:
add r3, sp, #48
ldr r2, [sp, #32]
mov r1, r8
@@ -12931,22 +12969,22 @@ FtlWriteToIDB:
ldr r7, [r4, #8]
blx r7
adds r0, r0, #1
- beq .L1665
+ beq .L1708
ldr r3, [sp, #32]
add r3, r3, #2048
str r3, [sp, #32]
-.L1662:
+.L1705:
adds r6, r6, #1
add r8, r8, #1
- b .L1658
-.L1663:
+ b .L1701
+.L1706:
ldr r2, [r4, #20]
cmp r2, #0
ite eq
moveq fp, #6
movne fp, #9
- b .L1664
-.L1668:
+ b .L1707
+.L1711:
add r3, sp, #48
mov r2, r6
add r1, r8, r5
@@ -12954,18 +12992,18 @@ FtlWriteToIDB:
ldr r7, [r4, #12]
blx r7
adds r0, r0, #1
- beq .L1671
+ beq .L1714
ldr r2, [sp, #52]
movw r3, #61424
cmp r2, r3
- bne .L1671
+ bne .L1714
add r6, r6, #2048
-.L1669:
+.L1712:
adds r5, r5, #1
- b .L1667
-.L1716:
+ b .L1710
+.L1759:
.align 2
-.L1715:
+.L1758:
.word .LANCHOR182
.word .LANCHOR183
.word -52655045
@@ -12973,46 +13011,46 @@ FtlWriteToIDB:
.word .LANCHOR78
.word .LANCHOR184
.word 1179535694
- .word .LC42
-.L1673:
+ .word .LC50
+.L1716:
ldr r3, [sp, #36]
adds r5, r5, #1
cmp r5, r3
- bne .L1670
+ bne .L1713
ldr r3, [sp, #20]
adds r3, r3, #1
cmp r3, #5
str r3, [sp, #20]
- bls .L1674
- b .L1677
-.L1647:
+ bls .L1717
+ b .L1720
+.L1690:
cmp r0, #64
- bne .L1678
- ldr fp, .L1717+4
+ bne .L1721
+ ldr fp, .L1760+4
mov r0, #262144
bl ftl_malloc
str r0, [fp]
mov r0, #262144
bl ftl_malloc
- ldr r3, .L1717
+ ldr r3, .L1760
str r0, [r3]
ldr r3, [fp]
- cbz r3, .L1679
- cbz r0, .L1679
+ cbz r3, .L1722
+ cbz r0, .L1722
movs r2, #1
movs r1, #0
str r2, [r5]
mov r0, r3
mov r2, #262144
bl ftl_memset
-.L1678:
+.L1721:
ldr r3, [r5]
cmp r3, #0
- beq .L1714
- ldr r3, .L1717+4
+ beq .L1757
+ ldr r3, .L1760+4
cmp r4, #63
iteee hi
- ldrhi r5, .L1717+8
+ ldrhi r5, .L1760+8
rsbls r4, r4, #64
subls r6, r6, r4
addls r7, r7, r4, lsl #9
@@ -13020,7 +13058,7 @@ FtlWriteToIDB:
mov r2, #262144
it hi
addhi r5, r5, r4
- ldr r0, .L1717+12
+ ldr r0, .L1760+12
ite ls
movls r5, r1
addhi r5, r1, r5, lsl #9
@@ -13035,21 +13073,21 @@ FtlWriteToIDB:
mov r1, r7
mov r0, r5
bl ftl_memcpy
- b .L1714
-.L1679:
- ldr r1, .L1717+16
- ldr r0, .L1717+20
+ b .L1757
+.L1722:
+ ldr r1, .L1760+16
+ ldr r0, .L1760+20
bl printf
- b .L1678
-.L1718:
+ b .L1721
+.L1761:
.align 2
-.L1717:
+.L1760:
.word .LANCHOR184
.word .LANCHOR183
.word 8388544
- .word .LC44
+ .word .LC52
.word .LANCHOR185
- .word .LC43
+ .word .LC51
.size FtlWriteToIDB, .-FtlWriteToIDB
.section .text.sftl_write,"ax",%progbits
.align 1
@@ -13715,7 +13753,7 @@ g_gc_skip_write_count:
.space 4
.section .bss.g_gc_superblock,"aw",%nobits
.align 2
- .set .LANCHOR144,. + 0
+ .set .LANCHOR145,. + 0
.type g_gc_superblock, %object
.size g_gc_superblock, 48
g_gc_superblock:
@@ -13778,7 +13816,7 @@ g_nand_phy_info:
.space 24
.section .bss.g_num_data_superblocks,"aw",%nobits
.align 1
- .set .LANCHOR45,. + 0
+ .set .LANCHOR44,. + 0
.type g_num_data_superblocks, %object
.size g_num_data_superblocks, 2
g_num_data_superblocks:
@@ -13841,7 +13879,7 @@ g_tmp_data_superblock_id:
.space 2
.section .bss.g_totle_avg_erase_count,"aw",%nobits
.align 2
- .set .LANCHOR145,. + 0
+ .set .LANCHOR143,. + 0
.type g_totle_avg_erase_count, %object
.size g_totle_avg_erase_count, 4
g_totle_avg_erase_count:
@@ -14029,21 +14067,21 @@ p_data_block_list_table:
.space 4
.section .bss.p_data_block_list_tail,"aw",%nobits
.align 2
- .set .LANCHOR44,. + 0
+ .set .LANCHOR43,. + 0
.type p_data_block_list_tail, %object
.size p_data_block_list_tail, 4
p_data_block_list_tail:
.space 4
.section .bss.p_erase_count_table,"aw",%nobits
.align 2
- .set .LANCHOR43,. + 0
+ .set .LANCHOR47,. + 0
.type p_erase_count_table, %object
.size p_erase_count_table, 4
p_erase_count_table:
.space 4
.section .bss.p_free_data_block_list_head,"aw",%nobits
.align 2
- .set .LANCHOR47,. + 0
+ .set .LANCHOR46,. + 0
.type p_free_data_block_list_head, %object
.size p_free_data_block_list_head, 4
p_free_data_block_list_head:
@@ -14312,316 +14350,334 @@ power_up_flag:
.LC8:
.ascii "not free: w: s:\000"
.section .rodata.FlashProgPages.str1.1,"aMS",%progbits,1
-.LC11:
+.LC14:
.ascii "prog read error: = %x\012\000"
-.LC12:
+.LC15:
+ .ascii "prog read REFRESH: = %x\012\000"
+.LC16:
.ascii "prog read s error: = %x %x %x\012\000"
-.LC13:
+.LC17:
.ascii "prog read d error: = %x %x %x\012\000"
+ .section .rodata.FlashReadPages.str1.1,"aMS",%progbits,1
+.LC11:
+ .ascii "FlashReadPages %x %x error_ecc_bits %d\012\000"
+.LC12:
+ .ascii "data:\000"
+.LC13:
+ .ascii "spare:\000"
.section .rodata.FtlBbmMapBadBlock.str1.1,"aMS",%progbits,1
.LC0:
.ascii "phyBlk = 0x%x die = %d block_in_die = 0x%x 0x%8x\012"
.ascii "\000"
.section .rodata.FtlBbmTblFlush.str1.1,"aMS",%progbits,1
-.LC14:
+.LC18:
.ascii "FtlBbmTblFlush id=%x,page=%x,previd=%x cnt=%d\012\000"
-.LC15:
+.LC19:
.ascii "FtlBbmTblFlush error:%x\012\000"
-.LC16:
+.LC20:
.ascii "FtlBbmTblFlush error = %x error count = %d\012\000"
.section .rodata.FtlFreeSysBlkQueueOut.str1.1,"aMS",%progbits,1
.LC9:
.ascii "FtlFreeSysBlkQueueOut = %x, free count = %d, error\012"
.ascii "\000"
.section .rodata.FtlGcScanTempBlk.str1.1,"aMS",%progbits,1
-.LC31:
+.LC35:
.ascii "FtlGcScanTempBlk Error ID %x %x!!!!!!! \012\000"
.section .rodata.FtlLoadEctTbl.str1.1,"aMS",%progbits,1
-.LC33:
+.LC37:
.ascii "no ect\000"
-.LC34:
+.LC38:
.ascii "%s\012\000"
.section .rodata.FtlLoadSysInfo.str1.1,"aMS",%progbits,1
-.LC38:
+.LC46:
.ascii "%s hash error this.id =%x page =%x pre_id =%x hash "
.ascii "=%x hash_r =%x\012\000"
.section .rodata.FtlMapTblRecovery.str1.1,"aMS",%progbits,1
-.LC39:
+.LC47:
.ascii "%s last blk_id =%x page =%x hash error hash =%x has"
.ascii "h_r =%x\012\000"
-.LC40:
+.LC48:
.ascii "%s scan blk_id =%x page =%x hash error hash =%x has"
.ascii "h_r =%x\012\000"
.section .rodata.FtlMapWritePage.str1.1,"aMS",%progbits,1
-.LC18:
+.LC22:
.ascii "FtlMapWritePage error = %x \012\000"
-.LC19:
+.LC23:
.ascii "FtlMapWritePage error = %x error count = %d\012\000"
.section .rodata.FtlProgPages.str1.1,"aMS",%progbits,1
-.LC36:
+.LC40:
+ .ascii "FtlProgPages error %x = %d\012\000"
+.LC41:
.ascii "Ftlwrite decrement_vpc_count %x = %d\012\000"
.section .rodata.FtlRecoverySuperblock.str1.1,"aMS",%progbits,1
-.LC24:
+.LC27:
+ .ascii "data prev_ppa = %x error...................\012\000"
+.LC28:
.ascii "spuer block %x vpn is 0\012 \000"
.section .rodata.FtlVendorPartRead.str1.1,"aMS",%progbits,1
-.LC32:
+.LC36:
.ascii "FtlVendorPartRead refresh = %x phyAddr = %x\012\000"
.section .rodata.FtlVpcTblFlush.str1.1,"aMS",%progbits,1
-.LC35:
+.LC39:
.ascii "FtlVpcTblFlush error = %x error count = %d\012\000"
.section .rodata.FtlWrite.str1.1,"aMS",%progbits,1
-.LC37:
+.LC44:
+ .ascii "FtlWrite: ecc error:%x %x %x\012\000"
+.LC45:
.ascii "FtlWrite: lpa error:%x %x\012\000"
.section .rodata.FtlWriteToIDB.str1.1,"aMS",%progbits,1
-.LC42:
+.LC50:
.ascii "write_idblock fail! %x %x %x %x\012\000"
-.LC43:
+.LC51:
.ascii "%s idb buffer alloc fail\012\000"
-.LC44:
+.LC52:
.ascii "%p %x %p %x\012\000"
.section .rodata.INSERT_DATA_LIST.str1.1,"aMS",%progbits,1
.LC1:
.ascii "\012!!!!! error @ func:%s - line:%d\012\000"
- .section .rodata.__func__.10015,"a",%progbits
+ .section .rodata.__func__.10006,"a",%progbits
.set .LANCHOR175,. + 0
- .type __func__.10015, %object
- .size __func__.10015, 23
-__func__.10015:
+ .type __func__.10006, %object
+ .size __func__.10006, 23
+__func__.10006:
.ascii "rk_ftl_garbage_collect\000"
- .section .rodata.__func__.10277,"a",%progbits
+ .section .rodata.__func__.10278,"a",%progbits
.set .LANCHOR137,. + 0
- .type __func__.10277, %object
- .size __func__.10277, 15
-__func__.10277:
+ .type __func__.10278, %object
+ .size __func__.10278, 15
+__func__.10278:
.ascii "FlashReadPages\000"
- .section .rodata.__func__.10296,"a",%progbits
+ .section .rodata.__func__.10297,"a",%progbits
.set .LANCHOR142,. + 0
- .type __func__.10296, %object
- .size __func__.10296, 15
-__func__.10296:
+ .type __func__.10297, %object
+ .size __func__.10297, 15
+__func__.10297:
.ascii "FlashProgPages\000"
- .section .rodata.__func__.10320,"a",%progbits
+ .section .rodata.__func__.10321,"a",%progbits
.set .LANCHOR77,. + 0
- .type __func__.10320, %object
- .size __func__.10320, 17
-__func__.10320:
+ .type __func__.10321, %object
+ .size __func__.10321, 17
+__func__.10321:
.ascii "FlashEraseBlocks\000"
- .section .rodata.__func__.10435,"a",%progbits
+ .section .rodata.__func__.10436,"a",%progbits
.set .LANCHOR185,. + 0
- .type __func__.10435, %object
- .size __func__.10435, 14
-__func__.10435:
+ .type __func__.10436, %object
+ .size __func__.10436, 14
+__func__.10436:
.ascii "FtlWriteToIDB\000"
- .section .rodata.__func__.8940,"a",%progbits
+ .section .rodata.__func__.8930,"a",%progbits
.set .LANCHOR169,. + 0
- .type __func__.8940, %object
- .size __func__.8940, 13
-__func__.8940:
+ .type __func__.8930, %object
+ .size __func__.8930, 13
+__func__.8930:
.ascii "FtlProgPages\000"
- .section .rodata.__func__.8968,"a",%progbits
+ .section .rodata.__func__.8958,"a",%progbits
.set .LANCHOR177,. + 0
- .type __func__.8968, %object
- .size __func__.8968, 9
-__func__.8968:
+ .type __func__.8958, %object
+ .size __func__.8958, 9
+__func__.8958:
.ascii "FtlWrite\000"
- .section .rodata.__func__.9043,"a",%progbits
+ .section .rodata.__func__.9033,"a",%progbits
.set .LANCHOR128,. + 0
- .type __func__.9043, %object
- .size __func__.9043, 14
-__func__.9043:
+ .type __func__.9033, %object
+ .size __func__.9033, 14
+__func__.9033:
.ascii "FtlBbt2Bitmap\000"
- .section .rodata.__func__.9078,"a",%progbits
+ .section .rodata.__func__.9068,"a",%progbits
.set .LANCHOR141,. + 0
- .type __func__.9078, %object
- .size __func__.9078, 11
-__func__.9078:
+ .type __func__.9068, %object
+ .size __func__.9068, 11
+__func__.9068:
.ascii "FtlLoadBbt\000"
- .section .rodata.__func__.9193,"a",%progbits
+ .section .rodata.__func__.9183,"a",%progbits
.set .LANCHOR49,. + 0
- .type __func__.9193, %object
- .size __func__.9193, 17
-__func__.9193:
+ .type __func__.9183, %object
+ .size __func__.9183, 17
+__func__.9183:
.ascii "INSERT_FREE_LIST\000"
- .section .rodata.__func__.9198,"a",%progbits
- .set .LANCHOR46,. + 0
- .type __func__.9198, %object
- .size __func__.9198, 17
-__func__.9198:
+ .section .rodata.__func__.9188,"a",%progbits
+ .set .LANCHOR45,. + 0
+ .type __func__.9188, %object
+ .size __func__.9188, 17
+__func__.9188:
.ascii "INSERT_DATA_LIST\000"
- .section .rodata.__func__.9229,"a",%progbits
+ .section .rodata.__func__.9219,"a",%progbits
.set .LANCHOR50,. + 0
- .type __func__.9229, %object
- .size __func__.9229, 17
-__func__.9229:
+ .type __func__.9219, %object
+ .size __func__.9219, 17
+__func__.9219:
.ascii "List_remove_node\000"
- .section .rodata.__func__.9261,"a",%progbits
+ .section .rodata.__func__.9251,"a",%progbits
.set .LANCHOR54,. + 0
- .type __func__.9261, %object
- .size __func__.9261, 22
-__func__.9261:
+ .type __func__.9251, %object
+ .size __func__.9251, 22
+__func__.9251:
.ascii "List_update_data_list\000"
- .section .rodata.__func__.9270,"a",%progbits
+ .section .rodata.__func__.9260,"a",%progbits
.set .LANCHOR150,. + 0
- .type __func__.9270, %object
- .size __func__.9270, 16
-__func__.9270:
+ .type __func__.9260, %object
+ .size __func__.9260, 16
+__func__.9260:
.ascii "load_l2p_region\000"
- .section .rodata.__func__.9303,"a",%progbits
+ .section .rodata.__func__.9293,"a",%progbits
.set .LANCHOR81,. + 0
- .type __func__.9303, %object
- .size __func__.9303, 26
-__func__.9303:
+ .type __func__.9293, %object
+ .size __func__.9293, 26
+__func__.9293:
.ascii "ftl_map_blk_alloc_new_blk\000"
- .section .rodata.__func__.9314,"a",%progbits
+ .section .rodata.__func__.9304,"a",%progbits
.set .LANCHOR151,. + 0
- .type __func__.9314, %object
- .size __func__.9314, 15
-__func__.9314:
+ .type __func__.9304, %object
+ .size __func__.9304, 15
+__func__.9304:
.ascii "ftl_map_blk_gc\000"
- .section .rodata.__func__.9329,"a",%progbits
+ .section .rodata.__func__.9319,"a",%progbits
.set .LANCHOR148,. + 0
- .type __func__.9329, %object
- .size __func__.9329, 31
-__func__.9329:
+ .type __func__.9319, %object
+ .size __func__.9319, 31
+__func__.9319:
.ascii "Ftl_write_map_blk_to_last_page\000"
- .section .rodata.__func__.9343,"a",%progbits
+ .section .rodata.__func__.9333,"a",%progbits
.set .LANCHOR149,. + 0
- .type __func__.9343, %object
- .size __func__.9343, 16
-__func__.9343:
+ .type __func__.9333, %object
+ .size __func__.9333, 16
+__func__.9333:
.ascii "FtlMapWritePage\000"
- .section .rodata.__func__.9368,"a",%progbits
+ .section .rodata.__func__.9358,"a",%progbits
.set .LANCHOR57,. + 0
- .type __func__.9368, %object
- .size __func__.9368, 22
-__func__.9368:
+ .type __func__.9358, %object
+ .size __func__.9358, 22
+__func__.9358:
.ascii "select_l2p_ram_region\000"
- .section .rodata.__func__.9385,"a",%progbits
+ .section .rodata.__func__.9375,"a",%progbits
.set .LANCHOR153,. + 0
- .type __func__.9385, %object
- .size __func__.9385, 9
-__func__.9385:
+ .type __func__.9375, %object
+ .size __func__.9375, 9
+__func__.9375:
.ascii "log2phys\000"
- .section .rodata.__func__.9449,"a",%progbits
+ .section .rodata.__func__.9439,"a",%progbits
.set .LANCHOR165,. + 0
- .type __func__.9449, %object
- .size __func__.9449, 15
-__func__.9449:
+ .type __func__.9439, %object
+ .size __func__.9439, 15
+__func__.9439:
.ascii "FtlVpcTblFlush\000"
- .section .rodata.__func__.9471,"a",%progbits
+ .section .rodata.__func__.9461,"a",%progbits
.set .LANCHOR140,. + 0
- .type __func__.9471, %object
- .size __func__.9471, 14
-__func__.9471:
+ .type __func__.9461, %object
+ .size __func__.9461, 14
+__func__.9461:
.ascii "FtlScanSysBlk\000"
- .section .rodata.__func__.9527,"a",%progbits
+ .section .rodata.__func__.9517,"a",%progbits
.set .LANCHOR178,. + 0
- .type __func__.9527, %object
- .size __func__.9527, 15
-__func__.9527:
+ .type __func__.9517, %object
+ .size __func__.9517, 15
+__func__.9517:
.ascii "FtlLoadSysInfo\000"
- .section .rodata.__func__.9549,"a",%progbits
+ .section .rodata.__func__.9539,"a",%progbits
.set .LANCHOR180,. + 0
- .type __func__.9549, %object
- .size __func__.9549, 18
-__func__.9549:
+ .type __func__.9539, %object
+ .size __func__.9539, 18
+__func__.9539:
.ascii "FtlMapTblRecovery\000"
- .section .rodata.__func__.9595,"a",%progbits
+ .section .rodata.__func__.9585,"a",%progbits
.set .LANCHOR154,. + 0
- .type __func__.9595, %object
- .size __func__.9595, 16
-__func__.9595:
+ .type __func__.9585, %object
+ .size __func__.9585, 16
+__func__.9585:
.ascii "FtlReUsePrevPpa\000"
- .section .rodata.__func__.9629,"a",%progbits
+ .section .rodata.__func__.9619,"a",%progbits
.set .LANCHOR155,. + 0
- .type __func__.9629, %object
- .size __func__.9629, 22
-__func__.9629:
+ .type __func__.9619, %object
+ .size __func__.9619, 22
+__func__.9619:
.ascii "FtlRecoverySuperblock\000"
- .section .rodata.__func__.9686,"a",%progbits
+ .section .rodata.__func__.9676,"a",%progbits
.set .LANCHOR60,. + 0
- .type __func__.9686, %object
- .size __func__.9686, 16
-__func__.9686:
+ .type __func__.9676, %object
+ .size __func__.9676, 16
+__func__.9676:
.ascii "make_superblock\000"
- .section .rodata.__func__.9707,"a",%progbits
+ .section .rodata.__func__.9697,"a",%progbits
.set .LANCHOR136,. + 0
- .type __func__.9707, %object
- .size __func__.9707, 18
-__func__.9707:
+ .type __func__.9697, %object
+ .size __func__.9697, 18
+__func__.9697:
.ascii "SupperBlkListInit\000"
- .section .rodata.__func__.9734,"a",%progbits
+ .section .rodata.__func__.9724,"a",%progbits
.set .LANCHOR159,. + 0
- .type __func__.9734, %object
- .size __func__.9734, 14
-__func__.9734:
+ .type __func__.9724, %object
+ .size __func__.9724, 14
+__func__.9724:
.ascii "ftl_check_vpc\000"
- .section .rodata.__func__.9799,"a",%progbits
- .set .LANCHOR143,. + 0
- .type __func__.9799, %object
- .size __func__.9799, 25
-__func__.9799:
+ .section .rodata.__func__.9789,"a",%progbits
+ .set .LANCHOR144,. + 0
+ .type __func__.9789, %object
+ .size __func__.9789, 25
+__func__.9789:
.ascii "allocate_data_superblock\000"
- .section .rodata.__func__.9820,"a",%progbits
+ .section .rodata.__func__.9810,"a",%progbits
.set .LANCHOR168,. + 0
- .type __func__.9820, %object
- .size __func__.9820, 29
-__func__.9820:
+ .type __func__.9810, %object
+ .size __func__.9810, 29
+__func__.9810:
.ascii "allocate_new_data_superblock\000"
- .section .rodata.__func__.9827,"a",%progbits
+ .section .rodata.__func__.9817,"a",%progbits
.set .LANCHOR61,. + 0
- .type __func__.9827, %object
- .size __func__.9827, 19
-__func__.9827:
+ .type __func__.9817, %object
+ .size __func__.9817, 19
+__func__.9817:
.ascii "get_new_active_ppa\000"
- .section .rodata.__func__.9840,"a",%progbits
+ .section .rodata.__func__.9830,"a",%progbits
.set .LANCHOR146,. + 0
- .type __func__.9840, %object
- .size __func__.9840, 16
-__func__.9840:
+ .type __func__.9830, %object
+ .size __func__.9830, 16
+__func__.9830:
.ascii "update_vpc_list\000"
- .section .rodata.__func__.9847,"a",%progbits
+ .section .rodata.__func__.9837,"a",%progbits
.set .LANCHOR147,. + 0
- .type __func__.9847, %object
- .size __func__.9847, 20
-__func__.9847:
+ .type __func__.9837, %object
+ .size __func__.9837, 20
+__func__.9837:
.ascii "decrement_vpc_count\000"
- .section .rodata.__func__.9917,"a",%progbits
+ .section .rodata.__func__.9907,"a",%progbits
.set .LANCHOR170,. + 0
- .type __func__.9917, %object
- .size __func__.9917, 19
-__func__.9917:
+ .type __func__.9907, %object
+ .size __func__.9907, 19
+__func__.9907:
.ascii "FtlGcFreeTempBlock\000"
.section .rodata.decrement_vpc_count.str1.1,"aMS",%progbits,1
-.LC17:
+.LC21:
.ascii "decrement_vpc_count %x = %d\012\000"
.section .rodata.ftl_check_vpc.str1.1,"aMS",%progbits,1
-.LC25:
+.LC29:
.ascii "...%s enter...\012\000"
-.LC26:
+.LC30:
.ascii "FtlCheckVpc2 %x = %x %x\012\000"
-.LC27:
+.LC31:
.ascii "free blk vpc error %x = %x %x\012\000"
.section .rodata.ftl_map_blk_alloc_new_blk.str1.1,"aMS",%progbits,1
.LC10:
.ascii "FtlFreeSysBlkQueueOut = %x, free count = %d\012\000"
.section .rodata.ftl_scan_all_data.str1.1,"aMS",%progbits,1
-.LC28:
+.LC32:
.ascii "ftl_scan_all_data = %x\012\000"
-.LC29:
+.LC33:
.ascii "scan lpa = %x ppa= %x\012\000"
-.LC30:
+.LC34:
.ascii "lba = %x,addr= %x,spare= %x %x %x %x data=%x %x\012"
.ascii "\000"
.section .rodata.load_l2p_region.str1.1,"aMS",%progbits,1
-.LC20:
+.LC24:
.ascii "region_id = %x phyAddr = %x\012\000"
-.LC21:
- .ascii "spare:\000"
-.LC22:
+.LC25:
.ascii "map_ppn:\000"
-.LC23:
+.LC26:
.ascii "load_l2p_region refresh = %x phyAddr = %x\012\000"
+ .section .rodata.rk_ftl_garbage_collect.str1.1,"aMS",%progbits,1
+.LC42:
+ .ascii "g_gc_superblock_free %x %x %x %x %x\012\000"
+.LC43:
+ .ascii "lpa=%x, ppa=%x\012\000"
.section .rodata.rknand_print_hex.str1.1,"aMS",%progbits,1
.LC2:
.ascii "%s 0x%x:\000"
@@ -14632,6 +14688,6 @@ __func__.9917:
.LC5:
.ascii "\012\000"
.section .rodata.sftl_init.str1.1,"aMS",%progbits,1
-.LC41:
- .ascii "SFTL version: 5.0.50 20181227\000"
+.LC49:
+ .ascii "SFTL version: 5.0.50 20190215\000"
.hidden free
diff --git a/drivers/rkflash/rk_sftl_arm_v8.S b/drivers/rkflash/rk_sftl_arm_v8.S
index d54b12f7b3..8298fdd27c 100644
--- a/drivers/rkflash/rk_sftl_arm_v8.S
+++ b/drivers/rkflash/rk_sftl_arm_v8.S
@@ -2,7 +2,7 @@
* Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd
*
* SPDX-License-Identifier: GPL-2.0
- * date: 2018-12-27
+ * date: 2019-02-20
*/
.arch armv8-a+nosimd
.file "rk_sftl.c"
@@ -545,105 +545,84 @@ IsInFreeQueue:
insert_data_list:
adrp x1, .LANCHOR5
and w0, w0, 65535
- ldrh w14, [x1, #:lo12:.LANCHOR5]
- cmp w14, w0
- bls .L72
+ ldrh w12, [x1, #:lo12:.LANCHOR5]
+ cmp w12, w0
+ bls .L58
adrp x1, .LANCHOR40
- mov w3, 6
- ldr x6, [x1, #:lo12:.LANCHOR40]
- umull x13, w0, w3
+ mov w8, 6
+ ldr x4, [x1, #:lo12:.LANCHOR40]
+ umull x10, w0, w8
mov w1, -1
- add x5, x6, x13
- strh w1, [x5, 2]
- strh w1, [x6, x13]
+ add x3, x4, x10
+ strh w1, [x3, 2]
+ strh w1, [x4, x10]
adrp x1, .LANCHOR41
mov x15, x1
- ldr x12, [x1, #:lo12:.LANCHOR41]
- cbnz x12, .L59
- str x5, [x1, #:lo12:.LANCHOR41]
-.L72:
+ ldr x7, [x1, #:lo12:.LANCHOR41]
+ cbnz x7, .L59
+ str x3, [x1, #:lo12:.LANCHOR41]
+.L58:
mov w0, 0
ret
.L59:
- stp x29, x30, [sp, -32]!
adrp x1, .LANCHOR42
- ubfiz x2, x0, 1, 16
- mov x4, -6148914691236517206
- add x29, sp, 0
- ldr x16, [x1, #:lo12:.LANCHOR42]
- movk x4, 0xaaab, lsl 0
- ldrh w1, [x5, 4]
- mov w8, -1
- mov w11, w8
- stp x19, x20, [sp, 16]
+ mov x2, -6148914691236517206
+ movk x2, 0xaaab, lsl 0
+ mov w6, 0
+ ldr x13, [x1, #:lo12:.LANCHOR42]
+ ubfiz x1, x0, 1, 16
+ mov w16, 65535
+ ldrh w5, [x13, x1]
+ ldrh w1, [x3, 4]
cmp w1, 0
- mov w20, 65535
- ldrh w7, [x16, x2]
- mul w7, w7, w1
- sub x1, x12, x6
+ mul w5, w5, w1
+ sub x1, x7, x4
asr x1, x1, 1
- csel w7, w7, w8, ne
- mov w8, w3
- mul x1, x1, x4
- adrp x4, .LANCHOR43
- ldr x17, [x4, #:lo12:.LANCHOR43]
+ csinv w5, w5, wzr, ne
+ mul x1, x1, x2
+ mov x2, x7
and w1, w1, 65535
- mov x4, x12
- add x10, x17, x2
- mov w2, 0
-.L67:
- add w2, w2, 1
- and w2, w2, 65535
- cmp w14, w2
+.L64:
+ add w6, w6, 1
+ and w6, w6, 65535
+ cmp w12, w6
bcc .L58
cmp w1, w0
beq .L58
- ubfiz x30, x1, 1, 16
- ldrh w19, [x4, 4]
- cmp w19, 0
- ldrh w3, [x16, x30]
- mul w3, w3, w19
- csel w3, w3, w11, ne
- cmp w7, w3
+ ldrh w14, [x2, 4]
+ cbz w14, .L62
+ ubfiz x11, x1, 1, 16
+ ldrh w11, [x13, x11]
+ mul w11, w11, w14
+ cmp w5, w11
+ bls .L62
+ ldrh w11, [x2]
+ cmp w11, w16
bne .L63
- ldrh w19, [x17, x30]
- ldrh w3, [x10]
- cmp w19, w3
- bcc .L65
-.L64:
- strh w1, [x6, x13]
- cmp x4, x12
- ldrh w1, [x4, 2]
- strh w1, [x5, 2]
- bne .L68
- strh w0, [x4, 2]
- str x5, [x15, #:lo12:.LANCHOR41]
+ strh w1, [x3, 2]
+ strh w0, [x2]
+ adrp x0, .LANCHOR43
+ str x3, [x0, #:lo12:.LANCHOR43]
b .L58
.L63:
- bcc .L64
+ umaddl x2, w11, w8, x4
+ mov w1, w11
+ b .L64
+.L62:
+ strh w1, [x4, x10]
+ cmp x2, x7
+ ldrh w1, [x2, 2]
+ strh w1, [x3, 2]
+ bne .L65
+ strh w0, [x2, 2]
+ str x3, [x15, #:lo12:.LANCHOR41]
+ b .L58
.L65:
- ldrh w3, [x4]
- cmp w3, w20
- bne .L66
- strh w1, [x5, 2]
- strh w0, [x4]
- adrp x0, .LANCHOR44
- str x5, [x0, #:lo12:.LANCHOR44]
-.L58:
- mov w0, 0
- ldp x19, x20, [sp, 16]
- ldp x29, x30, [sp], 32
- ret
-.L66:
- umaddl x4, w3, w8, x6
- mov w1, w3
- b .L67
-.L68:
- ldrh w1, [x4, 2]
- mov w2, 6
- umull x1, w1, w2
- strh w0, [x6, x1]
- strh w0, [x4, 2]
+ ldrh w1, [x2, 2]
+ mov w3, 6
+ umull x1, w1, w3
+ strh w0, [x4, x1]
+ strh w0, [x2, 2]
b .L58
.size insert_data_list, .-insert_data_list
.section .text.INSERT_DATA_LIST,"ax",@progbits
@@ -654,23 +633,23 @@ INSERT_DATA_LIST:
stp x29, x30, [sp, -16]!
add x29, sp, 0
bl insert_data_list
- adrp x1, .LANCHOR45
- ldrh w0, [x1, #:lo12:.LANCHOR45]
+ adrp x1, .LANCHOR44
+ ldrh w0, [x1, #:lo12:.LANCHOR44]
add w0, w0, 1
and w0, w0, 65535
- strh w0, [x1, #:lo12:.LANCHOR45]
+ strh w0, [x1, #:lo12:.LANCHOR44]
adrp x1, .LANCHOR5
ldrh w1, [x1, #:lo12:.LANCHOR5]
cmp w1, w0
- bcs .L74
+ bcs .L70
ldp x29, x30, [sp], 16
mov w2, 214
- adrp x1, .LANCHOR46
+ adrp x1, .LANCHOR45
adrp x0, .LC1
- add x1, x1, :lo12:.LANCHOR46
+ add x1, x1, :lo12:.LANCHOR45
add x0, x0, :lo12:.LC1
b printf
-.L74:
+.L70:
ldp x29, x30, [sp], 16
ret
.size INSERT_DATA_LIST, .-INSERT_DATA_LIST
@@ -682,7 +661,7 @@ insert_free_list:
and w0, w0, 65535
mov w7, 65535
cmp w0, w7
- beq .L78
+ beq .L74
adrp x1, .LANCHOR40
mov w6, 6
ldr x3, [x1, #:lo12:.LANCHOR40]
@@ -691,19 +670,19 @@ insert_free_list:
add x4, x3, x8
strh w1, [x4, 2]
strh w1, [x3, x8]
- adrp x1, .LANCHOR47
+ adrp x1, .LANCHOR46
mov x12, x1
- ldr x5, [x1, #:lo12:.LANCHOR47]
- cbnz x5, .L79
- str x4, [x1, #:lo12:.LANCHOR47]
-.L78:
+ ldr x5, [x1, #:lo12:.LANCHOR46]
+ cbnz x5, .L75
+ str x4, [x1, #:lo12:.LANCHOR46]
+.L74:
mov w0, 0
ret
-.L79:
- adrp x1, .LANCHOR43
+.L75:
+ adrp x1, .LANCHOR47
mov x2, -6148914691236517206
movk x2, 0xaaab, lsl 0
- ldr x11, [x1, #:lo12:.LANCHOR43]
+ ldr x11, [x1, #:lo12:.LANCHOR47]
ubfiz x1, x0, 1, 16
ldrh w13, [x11, x1]
sub x1, x5, x3
@@ -711,37 +690,37 @@ insert_free_list:
mul x1, x1, x2
mov x2, x5
and w1, w1, 65535
-.L82:
+.L78:
ubfiz x10, x1, 1, 16
ldrh w10, [x11, x10]
cmp w10, w13
- bcs .L80
+ bcs .L76
ldrh w10, [x2]
cmp w10, w7
- bne .L81
+ bne .L77
strh w1, [x4, 2]
strh w0, [x2]
- b .L78
-.L81:
+ b .L74
+.L77:
umaddl x2, w10, w6, x3
mov w1, w10
- b .L82
-.L80:
+ b .L78
+.L76:
ldrh w6, [x2, 2]
cmp x2, x5
strh w6, [x4, 2]
strh w1, [x3, x8]
- bne .L83
+ bne .L79
strh w0, [x2, 2]
- str x4, [x12, #:lo12:.LANCHOR47]
- b .L78
-.L83:
+ str x4, [x12, #:lo12:.LANCHOR46]
+ b .L74
+.L79:
ldrh w1, [x2, 2]
mov w4, 6
umull x1, w1, w4
strh w0, [x3, x1]
strh w0, [x2, 2]
- b .L78
+ b .L74
.size insert_free_list, .-insert_free_list
.section .text.INSERT_FREE_LIST,"ax",@progbits
.align 2
@@ -759,7 +738,7 @@ INSERT_FREE_LIST:
adrp x1, .LANCHOR5
ldrh w1, [x1, #:lo12:.LANCHOR5]
cmp w1, w0
- bcs .L84
+ bcs .L80
ldp x29, x30, [sp], 16
mov w2, 207
adrp x1, .LANCHOR49
@@ -767,7 +746,7 @@ INSERT_FREE_LIST:
add x1, x1, :lo12:.LANCHOR49
add x0, x0, :lo12:.LC1
b printf
-.L84:
+.L80:
ldp x29, x30, [sp], 16
ret
.size INSERT_FREE_LIST, .-INSERT_FREE_LIST
@@ -791,26 +770,26 @@ List_remove_node:
add x19, x23, x21
ldrh w1, [x19, 2]
cmp w1, w0
- bne .L88
+ bne .L84
ldr x0, [x22]
cmp x19, x0
- beq .L88
+ beq .L84
adrp x1, .LANCHOR50
adrp x0, .LC1
mov w2, 372
add x1, x1, :lo12:.LANCHOR50
add x0, x0, :lo12:.LC1
bl printf
-.L88:
+.L84:
ldr x0, [x22]
mov w1, 65535
cmp x19, x0
ldrh w0, [x23, x21]
- bne .L89
+ bne .L85
cmp w0, w1
- bne .L90
+ bne .L86
str xzr, [x22]
-.L91:
+.L87:
mov w0, -1
strh w0, [x23, x21]
strh w0, [x19, 2]
@@ -820,27 +799,27 @@ List_remove_node:
ldr x23, [sp, 48]
ldp x29, x30, [sp], 64
ret
-.L90:
+.L86:
ldr x1, [x20, #:lo12:.LANCHOR40]
mov w2, 6
umaddl x0, w0, w2, x1
mov w1, -1
str x0, [x22]
strh w1, [x0, 2]
- b .L91
-.L89:
+ b .L87
+.L85:
cmp w0, w1
ldrh w1, [x19, 2]
- bne .L92
+ bne .L88
cmp w1, w0
- beq .L91
+ beq .L87
mov w0, 6
mov w2, -1
umull x1, w1, w0
ldr x0, [x20, #:lo12:.LANCHOR40]
strh w2, [x0, x1]
- b .L91
-.L92:
+ b .L87
+.L88:
ldr x2, [x20, #:lo12:.LANCHOR40]
mov w3, 6
umaddl x4, w0, w3, x2
@@ -848,7 +827,7 @@ List_remove_node:
ldrh w1, [x19, 2]
umull x1, w1, w3
strh w0, [x2, x1]
- b .L91
+ b .L87
.size List_remove_node, .-List_remove_node
.section .text.List_pop_index_node,"ax",@progbits
.align 2
@@ -856,7 +835,7 @@ List_remove_node:
.type List_pop_index_node, %function
List_pop_index_node:
ldr x2, [x0]
- cbz x2, .L100
+ cbz x2, .L96
stp x29, x30, [sp, -32]!
adrp x3, .LANCHOR40
and w1, w1, 65535
@@ -865,9 +844,9 @@ List_pop_index_node:
str x19, [sp, 16]
mov w5, 6
ldr x19, [x3, #:lo12:.LANCHOR40]
-.L96:
- cbnz w1, .L97
-.L99:
+.L92:
+ cbnz w1, .L93
+.L95:
sub x19, x2, x19
mov x2, -6148914691236517206
asr x19, x19, 1
@@ -880,15 +859,15 @@ List_pop_index_node:
ldr x19, [sp, 16]
ldp x29, x30, [sp], 32
ret
-.L97:
+.L93:
ldrh w3, [x2]
cmp w3, w4
- beq .L99
+ beq .L95
sub w1, w1, #1
umaddl x2, w3, w5, x19
and w1, w1, 65535
- b .L96
-.L100:
+ b .L92
+.L96:
mov w0, 65535
ret
.size List_pop_index_node, .-List_pop_index_node
@@ -908,26 +887,26 @@ List_get_gc_head_node:
and w2, w0, 65535
adrp x0, .LANCHOR41
ldr x1, [x0, #:lo12:.LANCHOR41]
- cbz x1, .L111
+ cbz x1, .L107
adrp x0, .LANCHOR40
mov w4, 6
ldr x3, [x0, #:lo12:.LANCHOR40]
mov w0, 65535
-.L108:
- cbz w2, .L109
+.L104:
+ cbz w2, .L105
ldrh w1, [x1]
cmp w1, w0
- bne .L110
+ bne .L106
ret
-.L110:
+.L106:
sub w2, w2, #1
umaddl x1, w1, w4, x3
and w2, w2, 65535
- b .L108
-.L111:
+ b .L104
+.L107:
mov w0, 65535
ret
-.L109:
+.L105:
sub x0, x1, x3
mov x1, -6148914691236517206
asr x0, x0, 1
@@ -951,15 +930,15 @@ List_update_data_list:
ldrh w0, [x0, #:lo12:.LANCHOR51]
stp x25, x26, [sp, 64]
cmp w0, w19
- beq .L114
+ beq .L110
adrp x0, .LANCHOR52
ldrh w0, [x0, #:lo12:.LANCHOR52]
cmp w0, w19
- beq .L114
+ beq .L110
adrp x0, .LANCHOR53
ldrh w0, [x0, #:lo12:.LANCHOR53]
cmp w0, w19
- beq .L114
+ beq .L110
adrp x0, .LANCHOR40
mov w21, 6
adrp x24, .LANCHOR41
@@ -969,7 +948,7 @@ List_update_data_list:
ldr x1, [x24, #:lo12:.LANCHOR41]
add x22, x23, x21
cmp x22, x1
- beq .L114
+ beq .L110
adrp x1, .LANCHOR42
ubfiz x0, x19, 1, 16
mov x25, x1
@@ -982,25 +961,25 @@ List_update_data_list:
ldrh w0, [x22, 2]
csinv w20, w20, wzr, ne
cmp w0, w1
- bne .L117
+ bne .L113
ldrh w1, [x23, x21]
cmp w1, w0
- bne .L117
+ bne .L113
adrp x1, .LANCHOR54
adrp x0, .LC1
mov w2, 463
add x1, x1, :lo12:.LANCHOR54
add x0, x0, :lo12:.LC1
bl printf
-.L117:
+.L113:
ldrh w0, [x22, 2]
mov w1, 65535
cmp w0, w1
- bne .L118
+ bne .L114
ldrh w1, [x23, x21]
cmp w1, w0
- beq .L114
-.L118:
+ beq .L110
+.L114:
mov w1, 6
mov x2, -6148914691236517206
movk x2, 0xaaab, lsl 0
@@ -1016,26 +995,26 @@ List_update_data_list:
mul w0, w1, w2
csinv w0, w0, wzr, ne
cmp w20, w0
- bcs .L114
- adrp x20, .LANCHOR45
+ bcs .L110
+ adrp x20, .LANCHOR44
mov w1, w19
add x0, x24, :lo12:.LANCHOR41
bl List_remove_node
- ldrh w0, [x20, #:lo12:.LANCHOR45]
- cbnz w0, .L120
+ ldrh w0, [x20, #:lo12:.LANCHOR44]
+ cbnz w0, .L116
adrp x1, .LANCHOR54
adrp x0, .LC1
mov w2, 474
add x1, x1, :lo12:.LANCHOR54
add x0, x0, :lo12:.LC1
bl printf
-.L120:
- ldrh w0, [x20, #:lo12:.LANCHOR45]
+.L116:
+ ldrh w0, [x20, #:lo12:.LANCHOR44]
sub w0, w0, #1
- strh w0, [x20, #:lo12:.LANCHOR45]
+ strh w0, [x20, #:lo12:.LANCHOR44]
mov w0, w19
bl INSERT_DATA_LIST
-.L114:
+.L110:
mov w0, 0
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
@@ -1058,72 +1037,72 @@ select_l2p_ram_region:
adrp x0, .LANCHOR55
str x19, [sp, 16]
ldr x0, [x0, #:lo12:.LANCHOR55]
-.L125:
+.L121:
and w19, w1, 65535
cmp w19, w2
- bcc .L127
+ bcc .L123
add x3, x0, 4
mov w19, w2
mov w5, -2147483648
mov w1, 0
-.L128:
+.L124:
cmp w1, w2
- bne .L130
+ bne .L126
cmp w19, w2
- bcc .L126
+ bcc .L122
adrp x1, .LANCHOR56
mov w19, w2
mov w3, -1
ldrh w4, [x1, #:lo12:.LANCHOR56]
mov w1, 0
-.L131:
+.L127:
cmp w1, w2
- bne .L133
+ bne .L129
cmp w19, w1
- bcc .L126
+ bcc .L122
mov w2, 789
adrp x1, .LANCHOR57
adrp x0, .LC1
add x1, x1, :lo12:.LANCHOR57
add x0, x0, :lo12:.LC1
bl printf
- b .L126
-.L127:
+ b .L122
+.L123:
add x1, x1, 1
add x4, x0, x1, lsl 4
ldrh w4, [x4, -16]
cmp w4, w3
- bne .L125
-.L126:
+ bne .L121
+.L122:
mov w0, w19
ldr x19, [sp, 16]
ldp x29, x30, [sp], 32
ret
-.L130:
+.L126:
ldr w4, [x3]
- tbnz w4, #31, .L129
+ tbnz w4, #31, .L125
cmp w5, w4
- bls .L129
+ bls .L125
mov w5, w4
mov w19, w1
-.L129:
+.L125:
add w1, w1, 1
add x3, x3, 16
and w1, w1, 65535
- b .L128
-.L133:
+ b .L124
+.L129:
ldr w6, [x0, 4]
cmp w3, w6
- bls .L132
+ bls .L128
ldrh w5, [x0]
cmp w5, w4
csel w3, w3, w6, eq
csel w19, w19, w1, eq
-.L132:
+.L128:
add w1, w1, 1
add x0, x0, 16
and w1, w1, 65535
- b .L131
+ b .L127
.size select_l2p_ram_region, .-select_l2p_ram_region
.section .text.FtlUpdateVaildLpn,"ax",@progbits
.align 2
@@ -1134,12 +1113,12 @@ FtlUpdateVaildLpn:
mov x3, x2
ldrh w1, [x2, #:lo12:.LANCHOR58]
cmp w1, 4
- bhi .L136
- cbnz w0, .L136
+ bhi .L132
+ cbnz w0, .L132
add w1, w1, 1
strh w1, [x2, #:lo12:.LANCHOR58]
ret
-.L136:
+.L132:
adrp x1, .LANCHOR5
adrp x0, .LANCHOR59
strh wzr, [x3, #:lo12:.LANCHOR58]
@@ -1151,22 +1130,22 @@ FtlUpdateVaildLpn:
ldr x6, [x1, #:lo12:.LANCHOR42]
mov w7, 65535
mov x1, 0
-.L137:
+.L133:
cmp w5, w1, uxth
- bhi .L139
- cbz w3, .L135
+ bhi .L135
+ cbz w3, .L131
str w2, [x0, #:lo12:.LANCHOR59]
-.L135:
+.L131:
ret
-.L139:
+.L135:
ldrh w4, [x6, x1, lsl 1]
cmp w4, w7
- beq .L138
+ beq .L134
add w2, w2, w4
mov w3, 1
-.L138:
+.L134:
add x1, x1, 1
- b .L137
+ b .L133
.size FtlUpdateVaildLpn, .-FtlUpdateVaildLpn
.section .text.ftl_set_blk_mode,"ax",@progbits
.align 2
@@ -1174,9 +1153,9 @@ FtlUpdateVaildLpn:
.type ftl_set_blk_mode, %function
ftl_set_blk_mode:
and w0, w0, 65535
- cbz w1, .L146
+ cbz w1, .L142
b ftl_set_blk_mode.part.6
-.L146:
+.L142:
adrp x1, .LANCHOR1
ubfx x2, x0, 5, 11
lsl x2, x2, 2
@@ -1216,9 +1195,9 @@ ftl_sb_update_avl_pages:
add x4, x0, x4
ldrh w3, [x1, #:lo12:.LANCHOR3]
mov w1, 65535
-.L149:
+.L145:
cmp w2, w3
- bcc .L151
+ bcc .L147
adrp x1, .LANCHOR19
ubfiz x3, x3, 1, 16
add x3, x3, 16
@@ -1229,32 +1208,32 @@ ftl_sb_update_avl_pages:
sub w1, w1, #1
and w1, w1, 65535
sub w1, w1, w6
-.L152:
+.L148:
cmp x2, x3
- bne .L154
+ bne .L150
ret
-.L151:
+.L147:
ldrh w5, [x4]
cmp w5, w1
- beq .L150
+ beq .L146
ldrh w5, [x0, 4]
add w5, w5, 1
strh w5, [x0, 4]
-.L150:
+.L146:
add w2, w2, 1
add x4, x4, 2
and w2, w2, 65535
- b .L149
-.L154:
+ b .L145
+.L150:
ldrh w4, [x2]
cmp w4, w5
- beq .L153
+ beq .L149
ldrh w4, [x0, 4]
add w4, w1, w4
strh w4, [x0, 4]
-.L153:
+.L149:
add x2, x2, 2
- b .L152
+ b .L148
.size ftl_sb_update_avl_pages, .-ftl_sb_update_avl_pages
.section .text.FtlSlcSuperblockCheck,"ax",@progbits
.align 2
@@ -1262,38 +1241,38 @@ ftl_sb_update_avl_pages:
.type FtlSlcSuperblockCheck, %function
FtlSlcSuperblockCheck:
ldrh w1, [x0, 4]
- cbz w1, .L155
+ cbz w1, .L151
ldrh w2, [x0]
mov w1, 65535
cmp w2, w1
- beq .L155
+ beq .L151
ldrb w2, [x0, 6]
add x2, x2, 8
ldrh w3, [x0, x2, lsl 1]
adrp x2, .LANCHOR3
ldrh w4, [x2, #:lo12:.LANCHOR3]
mov w2, w1
-.L158:
+.L154:
cmp w3, w2
- beq .L160
-.L155:
+ beq .L156
+.L151:
ret
-.L160:
+.L156:
ldrb w1, [x0, 6]
add w1, w1, 1
and w1, w1, 255
strb w1, [x0, 6]
cmp w1, w4
- bne .L159
+ bne .L155
ldrh w1, [x0, 2]
strb wzr, [x0, 6]
add w1, w1, 1
strh w1, [x0, 2]
-.L159:
+.L155:
ldrb w1, [x0, 6]
add x1, x1, 8
ldrh w3, [x0, x1, lsl 1]
- b .L158
+ b .L154
.size FtlSlcSuperblockCheck, .-FtlSlcSuperblockCheck
.section .text.make_superblock,"ax",@progbits
.align 2
@@ -1308,14 +1287,14 @@ make_superblock:
adrp x0, .LANCHOR5
ldrh w0, [x0, #:lo12:.LANCHOR5]
cmp w1, w0
- bcc .L162
+ bcc .L158
adrp x1, .LANCHOR60
adrp x0, .LC1
- mov w2, 2156
+ mov w2, 2148
add x1, x1, :lo12:.LANCHOR60
add x0, x0, :lo12:.LC1
bl printf
-.L162:
+.L158:
adrp x0, .LANCHOR3
adrp x7, .LANCHOR13
add x6, x19, 16
@@ -1325,35 +1304,45 @@ make_superblock:
strh wzr, [x19, 4]
mov w10, -1
strb wzr, [x19, 7]
-.L163:
+.L159:
cmp w8, w5, uxth
- bhi .L165
+ bhi .L161
adrp x1, .LANCHOR19
ldrb w0, [x19, 7]
strb wzr, [x19, 9]
ldrh w1, [x1, #:lo12:.LANCHOR19]
mul w0, w0, w1
+ ldrh w1, [x19]
strh w0, [x19, 4]
+ adrp x0, .LANCHOR47
+ ldr x0, [x0, #:lo12:.LANCHOR47]
+ ldrh w1, [x0, x1, lsl 1]
+ mov w0, 10000
+ cmp w1, w0
+ bls .L162
+ mov w0, 1
+ strb w0, [x19, 9]
+.L162:
mov w0, 0
ldr x19, [sp, 16]
ldp x29, x30, [sp], 32
ret
-.L165:
+.L161:
ldrh w1, [x19]
ldrb w0, [x7, x5]
bl V2P_block
mov w4, w0
strh w10, [x6]
bl FtlBbmIsBadBlock
- cbnz w0, .L164
+ cbnz w0, .L160
strh w4, [x6]
ldrb w0, [x19, 7]
add w0, w0, 1
strb w0, [x19, 7]
-.L164:
+.L160:
add x5, x5, 1
add x6, x6, 2
- b .L163
+ b .L159
.size make_superblock, .-make_superblock
.section .text.update_multiplier_value,"ax",@progbits
.align 2
@@ -1370,11 +1359,11 @@ update_multiplier_value:
add x8, x8, :lo12:.LANCHOR13
ldrh w11, [x0, #:lo12:.LANCHOR19]
cmp w10, w7, uxth
- bhi .L179
- cbz w5, .L177
+ bhi .L176
+ cbz w5, .L174
mov w0, 32768
sdiv w5, w0, w5
-.L178:
+.L175:
adrp x0, .LANCHOR40
mov w1, 6
ldr x0, [x0, #:lo12:.LANCHOR40]
@@ -1382,31 +1371,31 @@ update_multiplier_value:
mov w0, 0
strh w5, [x6, 4]
ret
-.L172:
+.L169:
mov w5, 0
- b .L171
-.L177:
+ b .L168
+.L174:
mov w5, 0
- b .L178
-.L179:
+ b .L175
+.L176:
stp x29, x30, [sp, -16]!
add x29, sp, 0
-.L170:
+.L167:
ldrb w0, [x8, x7]
mov w1, w6
bl V2P_block
bl FtlBbmIsBadBlock
- cbnz w0, .L169
+ cbnz w0, .L166
add w5, w5, w11
and w5, w5, 65535
-.L169:
+.L166:
add x7, x7, 1
cmp w10, w7, uxth
- bhi .L170
- cbz w5, .L172
+ bhi .L167
+ cbz w5, .L169
mov w0, 32768
sdiv w5, w0, w5
-.L171:
+.L168:
adrp x0, .LANCHOR40
mov w1, 6
ldr x0, [x0, #:lo12:.LANCHOR40]
@@ -1421,9 +1410,9 @@ update_multiplier_value:
.global GetFreeBlockMinEraseCount
.type GetFreeBlockMinEraseCount, %function
GetFreeBlockMinEraseCount:
- adrp x0, .LANCHOR47
- ldr x0, [x0, #:lo12:.LANCHOR47]
- cbz x0, .L182
+ adrp x0, .LANCHOR46
+ ldr x0, [x0, #:lo12:.LANCHOR46]
+ cbz x0, .L179
adrp x1, .LANCHOR40
ldr x1, [x1, #:lo12:.LANCHOR40]
sub x0, x0, x1
@@ -1431,12 +1420,12 @@ GetFreeBlockMinEraseCount:
asr x0, x0, 1
movk x1, 0xaaab, lsl 0
mul x0, x0, x1
- adrp x1, .LANCHOR43
- ldr x1, [x1, #:lo12:.LANCHOR43]
+ adrp x1, .LANCHOR47
+ ldr x1, [x1, #:lo12:.LANCHOR47]
and x0, x0, 65535
ldrh w0, [x1, x0, lsl 1]
ret
-.L182:
+.L179:
mov w0, 0
ret
.size GetFreeBlockMinEraseCount, .-GetFreeBlockMinEraseCount
@@ -1445,10 +1434,10 @@ GetFreeBlockMinEraseCount:
.global GetFreeBlockMaxEraseCount
.type GetFreeBlockMaxEraseCount, %function
GetFreeBlockMaxEraseCount:
- adrp x1, .LANCHOR47
+ adrp x1, .LANCHOR46
and w0, w0, 65535
- ldr x1, [x1, #:lo12:.LANCHOR47]
- cbz x1, .L190
+ ldr x1, [x1, #:lo12:.LANCHOR46]
+ cbz x1, .L187
adrp x2, .LANCHOR48
mov w3, 7
mov w5, 6
@@ -1467,25 +1456,25 @@ GetFreeBlockMaxEraseCount:
mul x1, x1, x2
mov w2, 0
and w1, w1, 65535
-.L186:
+.L183:
cmp w0, w2
- beq .L189
+ beq .L186
umull x4, w1, w5
ldrh w4, [x3, x4]
cmp w4, w6
- bne .L187
-.L189:
- adrp x0, .LANCHOR43
+ bne .L184
+.L186:
+ adrp x0, .LANCHOR47
ubfiz x1, x1, 1, 16
- ldr x0, [x0, #:lo12:.LANCHOR43]
+ ldr x0, [x0, #:lo12:.LANCHOR47]
ldrh w0, [x0, x1]
ret
-.L187:
+.L184:
add w2, w2, 1
mov w1, w4
and w2, w2, 65535
- b .L186
-.L190:
+ b .L183
+.L187:
mov w0, 0
ret
.size GetFreeBlockMaxEraseCount, .-GetFreeBlockMaxEraseCount
@@ -1497,7 +1486,7 @@ free_data_superblock:
and w0, w0, 65535
mov w1, 65535
cmp w0, w1
- beq .L194
+ beq .L191
stp x29, x30, [sp, -16]!
adrp x2, .LANCHOR42
ubfiz x1, x0, 1, 16
@@ -1508,7 +1497,7 @@ free_data_superblock:
mov w0, 0
ldp x29, x30, [sp], 16
ret
-.L194:
+.L191:
mov w0, 0
ret
.size free_data_superblock, .-free_data_superblock
@@ -1525,101 +1514,106 @@ get_new_active_ppa:
mov w0, 65535
str x21, [sp, 32]
cmp w1, w0
- bne .L198
+ bne .L195
adrp x1, .LANCHOR61
adrp x0, .LC1
- mov w2, 2786
+ mov w2, 2781
add x1, x1, :lo12:.LANCHOR61
add x0, x0, :lo12:.LC1
bl printf
-.L198:
- adrp x20, .LANCHOR19
+.L195:
+ adrp x21, .LANCHOR19
ldrh w1, [x19, 2]
- ldrh w0, [x20, #:lo12:.LANCHOR19]
+ ldrh w0, [x21, #:lo12:.LANCHOR19]
cmp w1, w0
- bne .L199
+ bne .L196
adrp x1, .LANCHOR61
adrp x0, .LC1
- mov w2, 2787
+ mov w2, 2782
add x1, x1, :lo12:.LANCHOR61
add x0, x0, :lo12:.LC1
bl printf
-.L199:
+.L196:
ldrh w0, [x19, 4]
- cbnz w0, .L200
+ cbnz w0, .L197
adrp x1, .LANCHOR61
adrp x0, .LC1
- mov w2, 2788
+ mov w2, 2783
add x1, x1, :lo12:.LANCHOR61
add x0, x0, :lo12:.LC1
bl printf
-.L200:
+.L197:
ldrb w0, [x19, 6]
adrp x1, .LANCHOR3
strb wzr, [x19, 10]
add x0, x0, 8
- ldrh w2, [x1, #:lo12:.LANCHOR3]
+ ldrh w3, [x1, #:lo12:.LANCHOR3]
mov w1, 65535
ldrh w0, [x19, x0, lsl 1]
-.L201:
+.L198:
cmp w0, w1
- beq .L203
- ldrh w21, [x19, 2]
- mov w3, 65535
+ beq .L200
+ ldrh w20, [x19, 2]
+ ldrh w2, [x21, #:lo12:.LANCHOR19]
+ cmp w20, w2
+ bcs .L204
ldrh w1, [x19, 4]
- orr w21, w21, w0, lsl 10
+ orr w20, w20, w0, lsl 10
ldrb w0, [x19, 6]
+ mov w4, 65535
sub w1, w1, #1
and w1, w1, 65535
strh w1, [x19, 4]
-.L205:
+.L203:
add w0, w0, 1
and w0, w0, 255
- cmp w2, w0
- bne .L204
+ cmp w3, w0
+ bne .L202
ldrh w0, [x19, 2]
add w0, w0, 1
strh w0, [x19, 2]
mov w0, 0
-.L204:
- add x4, x19, x0, sxtw 1
- ldrh w4, [x4, 16]
- cmp w4, w3
- beq .L205
+.L202:
+ add x5, x19, x0, sxtw 1
+ ldrh w5, [x5, 16]
+ cmp w5, w4
+ beq .L203
strb w0, [x19, 6]
- ldrh w2, [x19, 2]
- ldrh w0, [x20, #:lo12:.LANCHOR19]
- cmp w2, w0
- bne .L197
- cbz w1, .L197
+ ldrh w0, [x19, 2]
+ cmp w0, w2
+ bne .L194
+ cbz w1, .L194
adrp x1, .LANCHOR61
adrp x0, .LC1
- mov w2, 2809
+ mov w2, 2806
add x1, x1, :lo12:.LANCHOR61
add x0, x0, :lo12:.LC1
bl printf
-.L197:
- mov w0, w21
+.L194:
+ mov w0, w20
ldr x21, [sp, 32]
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 48
ret
-.L203:
+.L200:
ldrb w0, [x19, 6]
add w0, w0, 1
and w0, w0, 255
strb w0, [x19, 6]
- cmp w0, w2
- bne .L202
+ cmp w0, w3
+ bne .L199
ldrh w0, [x19, 2]
strb wzr, [x19, 6]
add w0, w0, 1
strh w0, [x19, 2]
-.L202:
+.L199:
ldrb w0, [x19, 6]
add x0, x0, 8
ldrh w0, [x19, x0, lsl 1]
- b .L201
+ b .L198
+.L204:
+ mov w20, 65535
+ b .L194
.size get_new_active_ppa, .-get_new_active_ppa
.section .text.FtlGcBufInit,"ax",@progbits
.align 2
@@ -1650,21 +1644,21 @@ FtlGcBufInit:
add x4, x4, 8
mov w1, 0
mov w16, 1
-.L213:
+.L211:
add w13, w2, w10
add w12, w1, w11
cmp x3, x8
- bne .L214
+ bne .L212
adrp x1, .LANCHOR67
ldr x7, [x7, #:lo12:.LANCHOR64]
ldr x6, [x6, #:lo12:.LANCHOR65]
mov w8, 24
ldr w4, [x1, #:lo12:.LANCHOR67]
-.L215:
+.L213:
cmp w0, w4
- bcc .L216
+ bcc .L214
ret
-.L214:
+.L212:
asr w2, w2, 2
asr w1, w1, 2
add x2, x14, x2, sxtw 2
@@ -1676,8 +1670,8 @@ FtlGcBufInit:
add x4, x4, 32
mov w1, w12
mov w2, w13
- b .L213
-.L216:
+ b .L211
+.L214:
umull x3, w0, w8
mul w1, w10, w0
add x2, x5, x3
@@ -1691,7 +1685,7 @@ FtlGcBufInit:
asr w1, w1, 2
add x1, x6, x1, sxtw 2
str x1, [x2, 8]
- b .L215
+ b .L213
.size FtlGcBufInit, .-FtlGcBufInit
.section .text.FtlGcBufFree,"ax",@progbits
.align 2
@@ -1704,31 +1698,31 @@ FtlGcBufFree:
ldr w7, [x2, #:lo12:.LANCHOR67]
adrp x2, .LANCHOR63
ldr x5, [x2, #:lo12:.LANCHOR63]
-.L218:
+.L216:
cmp w3, w1
- bcs .L217
+ bcs .L215
ubfiz x4, x3, 5, 16
mov w2, 0
add x4, x0, x4
- b .L223
-.L219:
+ b .L221
+.L217:
add w2, w2, 1
and w2, w2, 65535
-.L223:
+.L221:
cmp w2, w7
- bcs .L220
+ bcs .L218
umull x6, w2, w8
add x10, x5, x6
ldr x11, [x5, x6]
ldr x6, [x4, 8]
cmp x11, x6
- bne .L219
+ bne .L217
str wzr, [x10, 16]
-.L220:
+.L218:
add w3, w3, 1
and w3, w3, 65535
- b .L218
-.L217:
+ b .L216
+.L215:
ret
.size FtlGcBufFree, .-FtlGcBufFree
.section .text.FtlGcBufAlloc,"ax",@progbits
@@ -1743,31 +1737,31 @@ FtlGcBufAlloc:
ldr w5, [x2, #:lo12:.LANCHOR67]
adrp x2, .LANCHOR63
ldr x6, [x2, #:lo12:.LANCHOR63]
-.L225:
+.L223:
cmp w3, w1
- bcs .L224
+ bcs .L222
mov w2, 0
- b .L230
-.L226:
+ b .L228
+.L224:
add w2, w2, 1
and w2, w2, 65535
-.L230:
+.L228:
cmp w2, w5
- bcs .L227
+ bcs .L225
umaddl x4, w2, w7, x6
ldr w10, [x4, 16]
- cbnz w10, .L226
+ cbnz w10, .L224
ubfiz x2, x3, 5, 16
ldr x10, [x4]
add x2, x0, x2
str w8, [x4, 16]
ldr x4, [x4, 8]
stp x10, x4, [x2, 8]
-.L227:
+.L225:
add w3, w3, 1
and w3, w3, 65535
- b .L225
-.L224:
+ b .L223
+.L222:
ret
.size FtlGcBufAlloc, .-FtlGcBufAlloc
.section .text.IsBlkInGcList,"ax",@progbits
@@ -1781,17 +1775,17 @@ IsBlkInGcList:
adrp x1, .LANCHOR69
ldr x3, [x1, #:lo12:.LANCHOR69]
mov x1, 0
-.L232:
+.L230:
cmp w2, w1, uxth
- bhi .L234
+ bhi .L232
mov w0, 0
ret
-.L234:
+.L232:
add x1, x1, 1
add x4, x3, x1, lsl 1
ldrh w4, [x4, -2]
cmp w4, w0
- bne .L232
+ bne .L230
mov w0, 1
ret
.size IsBlkInGcList, .-IsBlkInGcList
@@ -1813,24 +1807,24 @@ FtlGcUpdatePage:
mov x3, 0
ldrh w1, [x4, #:lo12:.LANCHOR68]
ldr x5, [x2, #:lo12:.LANCHOR69]
-.L237:
+.L235:
and w2, w3, 65535
cmp w2, w1
- bcc .L239
- bne .L238
+ bcc .L237
+ bne .L236
and x3, x3, 65535
strh w0, [x5, x3, lsl 1]
ldrh w0, [x4, #:lo12:.LANCHOR68]
add w0, w0, 1
strh w0, [x4, #:lo12:.LANCHOR68]
- b .L238
-.L239:
+ b .L236
+.L237:
add x3, x3, 1
add x2, x5, x3, lsl 1
ldrh w2, [x2, -2]
cmp w2, w7
- bne .L237
-.L238:
+ bne .L235
+.L236:
adrp x4, .LANCHOR70
adrp x1, .LANCHOR71
mov w3, 12
@@ -1854,23 +1848,23 @@ FtlGcRefreshBlock:
and w0, w0, 65535
ldrh w5, [x4, #:lo12:.LANCHOR72]
cmp w5, w0
- beq .L242
+ beq .L240
adrp x1, .LANCHOR73
ldrh w3, [x1, #:lo12:.LANCHOR73]
cmp w0, w3
- beq .L242
+ beq .L240
mov w2, 65535
cmp w5, w2
- bne .L243
+ bne .L241
strh w0, [x4, #:lo12:.LANCHOR72]
-.L242:
+.L240:
mov w0, 0
ret
-.L243:
+.L241:
cmp w3, w2
- bne .L242
+ bne .L240
strh w0, [x1, #:lo12:.LANCHOR73]
- b .L242
+ b .L240
.size FtlGcRefreshBlock, .-FtlGcRefreshBlock
.section .text.FtlGcMarkBadPhyBlk,"ax",@progbits
.align 2
@@ -1888,24 +1882,24 @@ FtlGcMarkBadPhyBlk:
add x3, x3, :lo12:.LANCHOR75
mov x2, 0
ldrh w0, [x1, #:lo12:.LANCHOR74]
-.L245:
+.L243:
cmp w0, w2, uxth
- bhi .L247
+ bhi .L245
cmp w0, 15
- bhi .L246
+ bhi .L244
add w2, w0, 1
strh w2, [x1, #:lo12:.LANCHOR74]
adrp x1, .LANCHOR75
add x1, x1, :lo12:.LANCHOR75
strh w6, [x1, w0, sxtw 1]
- b .L246
-.L247:
+ b .L244
+.L245:
add x2, x2, 1
add x4, x3, x2, lsl 1
ldrh w4, [x4, -2]
cmp w4, w6
- bne .L245
-.L246:
+ bne .L243
+.L244:
mov w0, 0
ldp x29, x30, [sp], 16
ret
@@ -1917,20 +1911,20 @@ FtlGcMarkBadPhyBlk:
FtlGcReFreshBadBlk:
adrp x0, .LANCHOR74
ldrh w0, [x0, #:lo12:.LANCHOR74]
- cbz w0, .L256
+ cbz w0, .L254
adrp x1, .LANCHOR72
ldrh w2, [x1, #:lo12:.LANCHOR72]
mov w1, 65535
cmp w2, w1
- bne .L256
+ bne .L254
stp x29, x30, [sp, -16]!
adrp x6, .LANCHOR76
add x29, sp, 0
ldrh w1, [x6, #:lo12:.LANCHOR76]
cmp w1, w0
- bcc .L251
+ bcc .L249
strh wzr, [x6, #:lo12:.LANCHOR76]
-.L251:
+.L249:
ldrh w1, [x6, #:lo12:.LANCHOR76]
adrp x0, .LANCHOR75
add x0, x0, :lo12:.LANCHOR75
@@ -1943,7 +1937,7 @@ FtlGcReFreshBadBlk:
strh w0, [x6, #:lo12:.LANCHOR76]
mov w0, 0
ret
-.L256:
+.L254:
mov w0, 0
ret
.size FtlGcReFreshBadBlk, .-FtlGcReFreshBadBlk
@@ -1987,9 +1981,9 @@ rknand_print_hex:
mov x19, 0
mov w20, 0
adrp x26, .LC3
-.L262:
+.L260:
cmp w27, w19
- bhi .L268
+ bhi .L266
ldp x19, x20, [sp, 16]
adrp x0, .LC5
ldp x21, x22, [sp, 32]
@@ -1999,40 +1993,40 @@ rknand_print_hex:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 96
b printf
-.L268:
- cbnz w20, .L263
+.L266:
+ cbnz w20, .L261
mov w2, w21
mov x1, x28
mov x0, x24
bl printf
-.L263:
+.L261:
cmp w23, 4
- bne .L264
+ bne .L262
ldr w1, [x22, x19, lsl 2]
-.L271:
+.L269:
add x0, x26, :lo12:.LC3
-.L270:
+.L268:
bl printf
add w20, w20, 1
cmp w20, 15
- bls .L267
+ bls .L265
mov w20, 0
adrp x0, .LC5
add x0, x0, :lo12:.LC5
bl printf
-.L267:
+.L265:
add x19, x19, 1
add w21, w21, w23
- b .L262
-.L264:
+ b .L260
+.L262:
cmp w23, 2
- bne .L266
+ bne .L264
ldrh w1, [x22, x19, lsl 1]
- b .L271
-.L266:
+ b .L269
+.L264:
ldrb w1, [x22, x19]
mov x0, x25
- b .L270
+ b .L268
.size rknand_print_hex, .-rknand_print_hex
.section .text.FlashEraseBlocks,"ax",@progbits
.align 2
@@ -2058,18 +2052,18 @@ FlashEraseBlocks:
lsl w26, w24, 3
mov x22, x0
add x27, x25, :lo12:.LANCHOR78
-.L273:
+.L271:
cmp x19, x23
- beq .L287
+ beq .L285
ldr w0, [x19]
add x2, x29, 104
add x1, x29, 108
bl l2p_addr_tran.isra.0
ldr w0, [x29, 104]
- cbnz w0, .L274
+ cbnz w0, .L272
ldr w1, [x29, 108]
cmp w26, w1
- bls .L274
+ bls .L272
mov x19, x20
add x21, x20, x21
adrp x22, .LC6
@@ -2077,10 +2071,10 @@ FlashEraseBlocks:
add x22, x22, :lo12:.LC6
add x20, x20, :lo12:.LANCHOR77
mov w23, -1
-.L275:
+.L273:
cmp x19, x21
- bne .L276
-.L287:
+ bne .L274
+.L285:
ldp x19, x20, [sp, 16]
mov w0, 0
ldp x21, x22, [sp, 32]
@@ -2089,7 +2083,7 @@ FlashEraseBlocks:
ldr x27, [sp, 80]
ldp x29, x30, [sp], 112
ret
-.L276:
+.L274:
ldr w2, [x29, 108]
mov x1, x20
str w23, [x19]
@@ -2108,34 +2102,34 @@ FlashEraseBlocks:
mov w2, w3
add x0, x0, :lo12:.LC8
bl rknand_print_hex
- b .L275
-.L274:
+ b .L273
+.L272:
add x1, x25, :lo12:.LANCHOR78
ldr x2, [x1, 8]
ldr w1, [x29, 108]
blr x2
- cbnz w0, .L277
+ cbnz w0, .L275
str wzr, [x19, -4]
-.L278:
+.L276:
add x0, x22, :lo12:.LANCHOR0
ldrh w0, [x0, 14]
cmp w0, 4
- bne .L280
+ bne .L278
ldrb w0, [x29, 104]
ldr x2, [x27, 8]
ldr w1, [x29, 108]
add w1, w24, w1
blr x2
- cbz w0, .L280
+ cbz w0, .L278
mov w0, -1
str w0, [x19, -4]
-.L280:
+.L278:
add x19, x19, 32
- b .L273
-.L277:
+ b .L271
+.L275:
mov w0, -1
str w0, [x19, -4]
- b .L278
+ b .L276
.size FlashEraseBlocks, .-FlashEraseBlocks
.section .text.FtlFreeSysBlkQueueIn,"ax",@progbits
.align 2
@@ -2150,15 +2144,15 @@ FtlFreeSysBlkQueueIn:
sub w2, w20, #1
mov w0, 65533
cmp w0, w2, uxth
- bcc .L289
+ bcc .L287
adrp x0, .LANCHOR38
add x2, x0, :lo12:.LANCHOR38
mov x19, x0
ldrh w2, [x2, 6]
cmp w2, 1024
- beq .L289
+ beq .L287
and w1, w1, 65535
- cbz w1, .L291
+ cbz w1, .L289
mov w0, w20
bl P2V_block_in_plane
and w21, w0, 65535
@@ -2169,9 +2163,9 @@ FtlFreeSysBlkQueueIn:
str w1, [x0, 4]
mov w1, w2
bl FlashEraseBlocks
- adrp x1, .LANCHOR43
+ adrp x1, .LANCHOR47
ubfiz x0, x21, 1, 16
- ldr x2, [x1, #:lo12:.LANCHOR43]
+ ldr x2, [x1, #:lo12:.LANCHOR47]
ldrh w1, [x2, x0]
add w1, w1, 1
strh w1, [x2, x0]
@@ -2179,7 +2173,7 @@ FtlFreeSysBlkQueueIn:
ldr w0, [x1, #:lo12:.LANCHOR80]
add w0, w0, 1
str w0, [x1, #:lo12:.LANCHOR80]
-.L291:
+.L289:
add x0, x19, :lo12:.LANCHOR38
ldrh w1, [x0, 6]
add w1, w1, 1
@@ -2190,7 +2184,7 @@ FtlFreeSysBlkQueueIn:
and w1, w1, 1023
strh w1, [x0, 4]
strh w20, [x2, 8]
-.L289:
+.L287:
ldp x19, x20, [sp, 16]
ldr x21, [sp, 32]
ldp x29, x30, [sp], 48
@@ -2208,7 +2202,7 @@ FtlFreeSysBlkQueueOut:
ldrh w2, [x1, 6]
stp x19, x20, [sp, 16]
mov x19, x0
- cbz w2, .L303
+ cbz w2, .L301
ldrh w0, [x1, 2]
sub w2, w2, #1
strh w2, [x1, 6]
@@ -2228,23 +2222,23 @@ FtlFreeSysBlkQueueOut:
ldr w0, [x1, #:lo12:.LANCHOR80]
add w0, w0, 1
str w0, [x1, #:lo12:.LANCHOR80]
-.L300:
+.L298:
sub w0, w20, #1
mov w1, 65533
cmp w1, w0, uxth
- bcs .L301
+ bcs .L299
add x0, x19, :lo12:.LANCHOR38
mov w1, w20
ldrh w2, [x0, 6]
adrp x0, .LC9
add x0, x0, :lo12:.LC9
bl printf
-.L302:
- b .L302
-.L303:
- mov w20, 65535
+.L300:
b .L300
.L301:
+ mov w20, 65535
+ b .L298
+.L299:
mov w0, w20
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 32
@@ -2263,27 +2257,27 @@ ftl_map_blk_alloc_new_blk:
mov w20, 0
ldr x0, [x0, 16]
str x21, [sp, 32]
-.L306:
+.L304:
cmp w20, w1
- beq .L310
+ beq .L308
mov x21, x0
ldrh w2, [x0], 2
- cbnz w2, .L307
+ cbnz w2, .L305
bl FtlFreeSysBlkQueueOut
and w1, w0, 65535
strh w0, [x21]
sub w2, w1, #1
mov w0, 65533
cmp w0, w2, uxth
- bcs .L308
+ bcs .L306
adrp x0, .LANCHOR38+6
ldrh w2, [x0, #:lo12:.LANCHOR38+6]
adrp x0, .LC10
add x0, x0, :lo12:.LC10
bl printf
-.L309:
- b .L309
-.L308:
+.L307:
+ b .L307
+.L306:
ldr w0, [x19, 48]
strh wzr, [x19, 2]
add w0, w0, 1
@@ -2292,26 +2286,26 @@ ftl_map_blk_alloc_new_blk:
strh w20, [x19]
add w0, w0, 1
strh w0, [x19, 8]
-.L310:
+.L308:
ldrh w0, [x19, 10]
cmp w0, w20
- bhi .L312
+ bhi .L310
adrp x1, .LANCHOR81
adrp x0, .LC1
mov w2, 578
add x1, x1, :lo12:.LANCHOR81
add x0, x0, :lo12:.LC1
bl printf
-.L312:
+.L310:
mov w0, 0
ldr x21, [sp, 32]
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 48
ret
-.L307:
+.L305:
add w20, w20, 1
and w20, w20, 65535
- b .L306
+ b .L304
.size ftl_map_blk_alloc_new_blk, .-ftl_map_blk_alloc_new_blk
.section .text.ftl_memset,"ax",@progbits
.align 2
@@ -2511,9 +2505,9 @@ FtlMemInit:
bl ftl_malloc
adrp x1, .LANCHOR118
str x0, [x1, #:lo12:.LANCHOR118]
- adrp x1, .LANCHOR43
+ adrp x1, .LANCHOR47
add x0, x0, 32
- str x0, [x1, #:lo12:.LANCHOR43]
+ str x0, [x1, #:lo12:.LANCHOR47]
ldrh w0, [x19, #:lo12:.LANCHOR6]
lsl w0, w0, 1
bl ftl_malloc
@@ -2609,36 +2603,36 @@ FtlMemInit:
mov w3, w5
str x0, [x2, 32]
mov x0, 1
-.L316:
+.L314:
cmp w0, w7
- bcc .L317
+ bcc .L315
mov w2, 8
sub w2, w2, w0
add x2, x2, 1
add x1, x1, :lo12:.LANCHOR37
mov x3, 0
-.L318:
+.L316:
add x3, x3, 1
cmp x2, x3
- bne .L319
+ bne .L317
mov w0, 0
ldr x23, [sp, 48]
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
ldp x29, x30, [sp], 64
ret
-.L317:
+.L315:
ldr x4, [x2, 32]
add w0, w0, 1
add x4, x4, x3, uxtw 2
add w3, w3, w5
str x4, [x6], 8
- b .L316
-.L319:
+ b .L314
+.L317:
add x4, x0, x3
add x4, x1, x4, lsl 3
str xzr, [x4, 24]
- b .L318
+ b .L316
.size FtlMemInit, .-FtlMemInit
.section .text.FtlBbt2Bitmap,"ax",@progbits
.align 2
@@ -2664,19 +2658,19 @@ FtlBbt2Bitmap:
mov w1, 0
mov x0, x20
bl ftl_memset
-.L324:
+.L322:
ldrh w0, [x22, x19]
cmp w0, w24
- beq .L321
+ beq .L319
ldrh w1, [x21]
cmp w1, w0
- bhi .L323
+ bhi .L321
adrp x0, .LC1
mov w2, 74
mov x1, x23
add x0, x0, :lo12:.LC1
bl printf
-.L323:
+.L321:
ldrh w2, [x22, x19]
mov w1, 1
add x19, x19, 2
@@ -2687,8 +2681,8 @@ FtlBbt2Bitmap:
ldr w1, [x20, x0]
orr w1, w1, w2
str w1, [x20, x0]
- bne .L324
-.L321:
+ bne .L322
+.L319:
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
ldp x23, x24, [sp, 48]
@@ -2751,10 +2745,10 @@ ftl_free_no_use_map_blk:
str x25, [sp, 64]
bl ftl_memset
mov w0, 0
-.L332:
+.L330:
ldrh w1, [x19, 6]
cmp w1, w0
- bhi .L336
+ bhi .L334
adrp x0, .LANCHOR20
mov w23, 0
mov w20, 0
@@ -2762,10 +2756,10 @@ ftl_free_no_use_map_blk:
ldrh w0, [x19]
strh w1, [x21, x0, lsl 1]
ldrh w24, [x21]
-.L337:
+.L335:
ldrh w0, [x19, 10]
cmp w0, w20
- bhi .L341
+ bhi .L339
mov w0, w23
ldr x25, [sp, 64]
ldp x19, x20, [sp, 16]
@@ -2773,64 +2767,64 @@ ftl_free_no_use_map_blk:
ldp x23, x24, [sp, 48]
ldp x29, x30, [sp], 80
ret
-.L336:
+.L334:
ubfiz x1, x0, 2, 16
ldr w2, [x20, x1]
mov w1, 0
ubfx x2, x2, 10, 16
-.L333:
+.L331:
ldrh w3, [x19, 10]
cmp w3, w1
- bhi .L335
+ bhi .L333
add w0, w0, 1
and w0, w0, 65535
- b .L332
-.L335:
+ b .L330
+.L333:
ubfiz x3, x1, 1, 16
ldrh w4, [x22, x3]
cmp w4, w2
- bne .L334
- cbz w2, .L334
+ bne .L332
+ cbz w2, .L332
ldrh w4, [x21, x3]
add w4, w4, 1
strh w4, [x21, x3]
-.L334:
+.L332:
add w1, w1, 1
and w1, w1, 65535
- b .L333
-.L341:
+ b .L331
+.L339:
ubfiz x0, x20, 1, 16
ldrh w1, [x21, x0]
cmp w24, w1
- bls .L338
+ bls .L336
add x25, x22, x0
ldrh w0, [x22, x0]
- cbnz w0, .L339
-.L340:
+ cbnz w0, .L337
+.L338:
add w20, w20, 1
and w20, w20, 65535
- b .L337
-.L338:
- cbnz w1, .L340
+ b .L335
+.L336:
+ cbnz w1, .L338
add x25, x22, x0
ldrh w0, [x22, x0]
- cbz w0, .L340
-.L342:
+ cbz w0, .L338
+.L340:
mov w1, 1
bl FtlFreeSysBlkQueueIn
strh wzr, [x25]
ldrh w0, [x19, 8]
sub w0, w0, #1
strh w0, [x19, 8]
- b .L340
-.L343:
+ b .L338
+.L341:
mov w24, 0
- b .L342
-.L339:
+ b .L340
+.L337:
mov w23, w20
- cbz w1, .L343
+ cbz w1, .L341
mov w24, w1
- b .L340
+ b .L338
.size ftl_free_no_use_map_blk, .-ftl_free_no_use_map_blk
.section .text.FtlL2PDataInit,"ax",@progbits
.align 2
@@ -2866,10 +2860,10 @@ FtlL2PDataInit:
mov w2, -1
ldrh w5, [x22, #:lo12:.LANCHOR23]
add x3, x0, x3, lsl 4
-.L353:
+.L351:
add x4, x1, x5
cmp x0, x3
- bne .L354
+ bne .L352
adrp x1, .LANCHOR129
add x0, x1, :lo12:.LANCHOR129
ldp x21, x22, [sp, 32]
@@ -2900,7 +2894,7 @@ FtlL2PDataInit:
str x1, [x0, 40]
ldp x29, x30, [sp], 64
ret
-.L354:
+.L352:
and x1, x1, -4
strh w2, [x0]
add x1, x6, x1
@@ -2908,7 +2902,7 @@ FtlL2PDataInit:
str x1, [x0, 8]
add x0, x0, 16
mov x1, x4
- b .L353
+ b .L351
.size FtlL2PDataInit, .-FtlL2PDataInit
.section .text.FtlVariablesInit,"ax",@progbits
.align 2
@@ -2938,10 +2932,10 @@ FtlVariablesInit:
ldr x0, [x0, #:lo12:.LANCHOR36]
lsl w2, w2, 1
bl ftl_memset
- adrp x0, .LANCHOR43
+ adrp x0, .LANCHOR47
ldrh w2, [x19, #:lo12:.LANCHOR6]
mov w1, 0
- ldr x0, [x0, #:lo12:.LANCHOR43]
+ ldr x0, [x0, #:lo12:.LANCHOR47]
lsl w2, w2, 1
bl ftl_memset
adrp x0, .LANCHOR117
@@ -2981,7 +2975,7 @@ SupperBlkListInit:
stp x23, x24, [sp, 48]
adrp x24, .LANCHOR40
stp x19, x20, [sp, 16]
- adrp x23, .LANCHOR45
+ adrp x23, .LANCHOR44
stp x21, x22, [sp, 32]
adrp x22, .LANCHOR48
mul w2, w2, w0
@@ -2994,44 +2988,44 @@ SupperBlkListInit:
add x26, x26, :lo12:.LANCHOR13
bl ftl_memset
mov w21, 0
- adrp x0, .LANCHOR47
+ adrp x0, .LANCHOR46
mov w20, 0
mov w19, 0
- strh wzr, [x23, #:lo12:.LANCHOR45]
- str xzr, [x0, #:lo12:.LANCHOR47]
+ strh wzr, [x23, #:lo12:.LANCHOR44]
+ str xzr, [x0, #:lo12:.LANCHOR46]
adrp x0, .LANCHOR41
strh wzr, [x22, #:lo12:.LANCHOR48]
adrp x27, .LANCHOR3
str xzr, [x0, #:lo12:.LANCHOR41]
- adrp x0, .LANCHOR44
- str xzr, [x0, #:lo12:.LANCHOR44]
-.L359:
+ adrp x0, .LANCHOR43
+ str xzr, [x0, #:lo12:.LANCHOR43]
+.L357:
ldrh w0, [x25]
cmp w19, w0
- bcs .L366
+ bcs .L364
adrp x0, .LANCHOR19
ldrh w8, [x27, #:lo12:.LANCHOR3]
mov x6, 0
mov w5, 0
ldrh w7, [x0, #:lo12:.LANCHOR19]
- b .L367
-.L361:
+ b .L365
+.L359:
ldrb w0, [x26, x6]
mov w1, w19
bl V2P_block
bl FtlBbmIsBadBlock
- cbnz w0, .L360
+ cbnz w0, .L358
add w5, w5, w7
and w5, w5, 65535
-.L360:
+.L358:
add x6, x6, 1
-.L367:
+.L365:
cmp w8, w6, uxth
- bhi .L361
- cbz w5, .L362
+ bhi .L359
+ cbz w5, .L360
mov w0, 32768
sdiv w5, w0, w5
-.L363:
+.L361:
ldr x1, [x24, #:lo12:.LANCHOR40]
mov w0, 6
umaddl x0, w19, w0, x1
@@ -3039,54 +3033,54 @@ SupperBlkListInit:
adrp x0, .LANCHOR51
ldrh w0, [x0, #:lo12:.LANCHOR51]
cmp w0, w19
- beq .L364
+ beq .L362
adrp x0, .LANCHOR52
ldrh w0, [x0, #:lo12:.LANCHOR52]
cmp w0, w19
- beq .L364
+ beq .L362
adrp x0, .LANCHOR53
ldrh w0, [x0, #:lo12:.LANCHOR53]
cmp w0, w19
- beq .L364
+ beq .L362
adrp x1, .LANCHOR42
ubfiz x0, x19, 1, 16
ldr x1, [x1, #:lo12:.LANCHOR42]
ldrh w0, [x1, x0]
- cbnz w0, .L365
+ cbnz w0, .L363
add w21, w21, 1
mov w0, w19
and w21, w21, 65535
bl INSERT_FREE_LIST
-.L364:
+.L362:
add w19, w19, 1
and w19, w19, 65535
- b .L359
-.L362:
+ b .L357
+.L360:
adrp x1, .LANCHOR42
ubfiz x0, x19, 1, 16
mov w2, -1
ldr x1, [x1, #:lo12:.LANCHOR42]
strh w2, [x1, x0]
- b .L363
-.L365:
+ b .L361
+.L363:
add w20, w20, 1
mov w0, w19
and w20, w20, 65535
bl INSERT_DATA_LIST
- b .L364
-.L366:
- strh w20, [x23, #:lo12:.LANCHOR45]
+ b .L362
+.L364:
+ strh w20, [x23, #:lo12:.LANCHOR44]
add w20, w20, w21
strh w21, [x22, #:lo12:.LANCHOR48]
cmp w20, w0
- ble .L368
+ ble .L366
adrp x1, .LANCHOR136
adrp x0, .LC1
- mov w2, 2216
+ mov w2, 2210
add x1, x1, :lo12:.LANCHOR136
add x0, x0, :lo12:.LC1
bl printf
-.L368:
+.L366:
mov w0, 0
ldr x27, [sp, 80]
ldp x19, x20, [sp, 16]
@@ -3146,31 +3140,31 @@ FlashGetBadBlockList:
blr x2
and w0, w0, 65535
cmp w0, 50
- bls .L373
+ bls .L371
mov w2, 256
mov w1, 255
mov x0, x19
bl ftl_memset
mov w0, 0
-.L373:
+.L371:
adrp x1, .LANCHOR0+14
ldrh w1, [x1, #:lo12:.LANCHOR0+14]
cmp w1, 4
- bne .L377
+ bne .L375
mov x1, 0
-.L375:
+.L373:
cmp w0, w1, uxth
- bhi .L376
-.L377:
+ bhi .L374
+.L375:
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 32
ret
-.L376:
+.L374:
ldrh w2, [x19, x1, lsl 1]
lsr w2, w2, 1
strh w2, [x19, x1, lsl 1]
add x1, x1, 1
- b .L375
+ b .L373
.size FlashGetBadBlockList, .-FlashGetBadBlockList
.section .text.ftl_memcpy,"ax",@progbits
.align 2
@@ -3202,7 +3196,7 @@ FlashReadPages:
add x24, x24, :lo12:.LANCHOR137
adrp x25, .LC1
add x25, x25, :lo12:.LC1
-.L381:
+.L379:
cmp x23, x19
bne .L392
ldp x19, x20, [sp, 16]
@@ -3215,34 +3209,34 @@ FlashReadPages:
ret
.L392:
ldr x0, [x19, 8]
- cbz x0, .L382
+ cbz x0, .L380
ldr x0, [x19, 16]
- cbnz x0, .L383
-.L382:
+ cbnz x0, .L381
+.L380:
mov w2, 90
mov x1, x24
mov x0, x25
bl printf
-.L383:
+.L381:
ldr w0, [x19, 4]
add x2, x29, 104
add x1, x29, 108
bl l2p_addr_tran.isra.0
ldr w0, [x29, 104]
cmp w0, 3
- bls .L384
+ bls .L382
mov w0, -1
str w0, [x19]
-.L385:
+.L383:
add x19, x19, 32
- b .L381
-.L384:
+ b .L379
+.L382:
ldr x20, [x19, 8]
adrp x26, .LANCHOR111
tst x20, 63
- beq .L386
+ beq .L384
ldr x20, [x26, #:lo12:.LANCHOR111]
-.L386:
+.L384:
adrp x22, .LANCHOR78
add x22, x22, :lo12:.LANCHOR78
ldr w1, [x29, 108]
@@ -3254,7 +3248,7 @@ FlashReadPages:
add x0, x21, :lo12:.LANCHOR0
ldrh w0, [x0, 14]
cmp w0, 4
- bne .L388
+ bne .L386
ldrb w0, [x29, 104]
add x2, x20, 2048
ldr x4, [x22, 24]
@@ -3264,40 +3258,65 @@ FlashReadPages:
add x3, x3, 8
blr x4
cmn w0, #1
- beq .L389
+ beq .L387
ldr x1, [x19, 16]
ldr w2, [x1, 12]
cmn w2, #1
- bne .L390
+ bne .L388
ldr w2, [x1, 8]
cmn w2, #1
- bne .L390
+ bne .L388
ldr w1, [x1]
cmn w1, #1
- beq .L390
-.L389:
+ beq .L388
+.L387:
mov w1, -1
str w1, [x19]
-.L390:
+.L388:
ldr w1, [x19]
cmn w1, #1
- beq .L388
+ beq .L389
cmp w0, 256
- bne .L388
+ bne .L389
str w0, [x19]
-.L388:
+.L389:
+ ldr w3, [x19]
+ cmp w3, 256
+ ccmn w3, #1, 4, ne
+ bne .L386
+ ldr w1, [x19, 4]
+ adrp x0, .LC11
+ ldr w2, [x29, 108]
+ add x0, x0, :lo12:.LC11
+ bl printf
+ ldr x1, [x19, 8]
+ cbz x1, .L391
+ mov w3, 4
+ adrp x0, .LC12
+ mov w2, w3
+ add x0, x0, :lo12:.LC12
+ bl rknand_print_hex
+.L391:
+ ldr x1, [x19, 16]
+ cbz x1, .L386
+ mov w3, 4
+ adrp x0, .LC13
+ mov w2, w3
+ add x0, x0, :lo12:.LC13
+ bl rknand_print_hex
+.L386:
ldr x0, [x26, #:lo12:.LANCHOR111]
cmp x20, x0
- bne .L385
+ bne .L383
ldr x0, [x19, 8]
cmp x20, x0
- beq .L385
+ beq .L383
adrp x1, .LANCHOR12
ldrh w2, [x1, #:lo12:.LANCHOR12]
mov x1, x20
lsl w2, w2, 9
bl ftl_memcpy
- b .L385
+ b .L383
.size FlashReadPages, .-FlashReadPages
.section .text.FtlLoadFactoryBbt,"ax",@progbits
.align 2
@@ -3329,10 +3348,10 @@ FtlLoadFactoryBbt:
mov w21, 0
mov w27, -1
str x25, [x1, 16]
-.L410:
+.L419:
ldrh w0, [x23]
cmp w21, w0
- bcc .L415
+ bcc .L424
ldp x19, x20, [sp, 16]
mov w0, 0
ldp x21, x22, [sp, 32]
@@ -3341,18 +3360,18 @@ FtlLoadFactoryBbt:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 112
ret
-.L415:
+.L424:
ldrh w19, [x26, #:lo12:.LANCHOR17]
add x24, x22, :lo12:.LANCHOR138
strh w27, [x20]
mov w3, 61664
sub w19, w19, #1
and w19, w19, 65535
-.L411:
+.L420:
ldrh w0, [x28]
sub w1, w0, #15
cmp w1, w19
- bgt .L413
+ bgt .L422
madd w0, w0, w21, w19
mov w2, 1
str w3, [x29, 108]
@@ -3364,19 +3383,19 @@ FtlLoadFactoryBbt:
ldr w0, [x24]
ldr w3, [x29, 108]
cmn w0, #1
- beq .L412
+ beq .L421
ldrh w0, [x25]
cmp w0, w3
- bne .L412
+ bne .L421
strh w19, [x20]
-.L413:
+.L422:
add w21, w21, 1
add x20, x20, 2
- b .L410
-.L412:
+ b .L419
+.L421:
sub w19, w19, #1
and w19, w19, 65535
- b .L411
+ b .L420
.size FtlLoadFactoryBbt, .-FtlLoadFactoryBbt
.section .text.FtlGetLastWrittenPage,"ax",@progbits
.align 2
@@ -3390,10 +3409,10 @@ FtlGetLastWrittenPage:
mov w23, w1
stp x19, x20, [sp, 16]
stp x21, x22, [sp, 32]
- bne .L421
+ bne .L430
adrp x1, .LANCHOR20
ldrh w19, [x1, #:lo12:.LANCHOR20]
-.L422:
+.L431:
adrp x1, .LANCHOR112
sub w19, w19, #1
sxth w19, w19
@@ -3410,24 +3429,24 @@ FtlGetLastWrittenPage:
bl FlashReadPages
ldr w0, [x29, 96]
cmn w0, #1
- bne .L423
+ bne .L432
mov w22, 0
mov w24, 2
-.L424:
+.L433:
cmp w22, w19
- ble .L427
-.L423:
+ ble .L436
+.L432:
mov w0, w19
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
ldp x23, x24, [sp, 48]
ldp x29, x30, [sp], 160
ret
-.L421:
+.L430:
adrp x1, .LANCHOR19
ldrh w19, [x1, #:lo12:.LANCHOR19]
- b .L422
-.L427:
+ b .L431
+.L436:
add w20, w22, w19
mov w2, w23
mov w1, 1
@@ -3439,20 +3458,20 @@ FtlGetLastWrittenPage:
bl FlashReadPages
ldr w0, [x29, 96]
cmn w0, #1
- bne .L425
+ bne .L434
ldr w0, [x29, 100]
cmn w0, #1
- bne .L425
+ bne .L434
ldr w0, [x29, 64]
cmn w0, #1
- beq .L425
+ beq .L434
sub w19, w20, #1
sxth w19, w19
- b .L424
-.L425:
+ b .L433
+.L434:
add w20, w20, 1
sxth w22, w20
- b .L424
+ b .L433
.size FtlGetLastWrittenPage, .-FtlGetLastWrittenPage
.section .text.FtlScanSysBlk,"ax",@progbits
.align 2
@@ -3512,12 +3531,12 @@ FtlScanSysBlk:
adrp x0, .LANCHOR82
add x0, x0, :lo12:.LANCHOR82
str x0, [x29, 112]
-.L433:
+.L442:
ldr x0, [x29, 120]
ldr w1, [x29, 172]
ldrh w0, [x0]
cmp w0, w1
- bls .L473
+ bls .L482
adrp x0, .LANCHOR3
adrp x25, .LANCHOR103
adrp x6, .LANCHOR13
@@ -3532,14 +3551,14 @@ FtlScanSysBlk:
ldr x10, [x0, #:lo12:.LANCHOR65]
adrp x0, .LANCHOR24
ldrh w8, [x0, #:lo12:.LANCHOR24]
- b .L474
-.L435:
+ b .L483
+.L444:
ldrh w1, [x29, 172]
ldrb w0, [x6, x5]
bl V2P_block
and w4, w0, 65535
bl FtlBbmIsBadBlock
- cbnz w0, .L434
+ cbnz w0, .L443
ubfiz x0, x22, 5, 16
mul w1, w22, w8
add x0, x7, x0
@@ -3550,19 +3569,19 @@ FtlScanSysBlk:
add x1, x10, x1, sxtw 2
str w4, [x0, 4]
stp x11, x1, [x0, 8]
-.L434:
+.L443:
add x5, x5, 1
-.L474:
+.L483:
cmp w12, w5, uxth
- bhi .L435
- cbnz w22, .L436
-.L472:
+ bhi .L444
+ cbnz w22, .L445
+.L481:
ldr w0, [x29, 172]
add w26, w0, 1
and w0, w26, 65535
str w0, [x29, 172]
- b .L433
-.L436:
+ b .L442
+.L445:
mov w1, w22
mov w2, 1
mov x0, x7
@@ -3573,7 +3592,7 @@ FtlScanSysBlk:
adrp x0, .LANCHOR140
add x0, x0, :lo12:.LANCHOR140
str x0, [x29, 136]
-.L471:
+.L480:
ldr x0, [x25, #:lo12:.LANCHOR103]
add x1, x0, x22
ldr w0, [x0, x22]
@@ -3581,10 +3600,10 @@ FtlScanSysBlk:
cmn w0, #1
ldr x27, [x1, 16]
ubfx x26, x3, 10, 16
- bne .L439
+ bne .L448
mov w5, 16
mov w7, 65535
-.L441:
+.L450:
ldr x0, [x25, #:lo12:.LANCHOR103]
add x6, x25, :lo12:.LANCHOR103
mov w2, 1
@@ -3602,78 +3621,78 @@ FtlScanSysBlk:
ldr w5, [x29, 168]
cmp w0, w7
ldr x6, [x29, 104]
- bne .L438
+ bne .L447
ldr x0, [x6]
mov w1, -1
str w1, [x0, x22]
ldr x0, [x6]
ldr w0, [x0, x22]
cmp w0, w1
- bne .L439
-.L440:
+ bne .L448
+.L449:
mov w1, 1
- b .L510
-.L438:
+ b .L519
+.L447:
ldr x0, [x25, #:lo12:.LANCHOR103]
ldr w0, [x0, x22]
cmn w0, #1
- bne .L439
+ bne .L448
sub w5, w5, #1
ands w5, w5, 65535
- bne .L441
- b .L440
-.L439:
+ bne .L450
+ b .L449
+.L448:
adrp x0, .LANCHOR82
ldr w1, [x0, #:lo12:.LANCHOR82]
ldr w0, [x27, 4]
cmn w1, #1
- beq .L442
+ beq .L451
cmp w1, w0
- bhi .L443
-.L442:
+ bhi .L452
+.L451:
cmn w0, #1
- beq .L443
+ beq .L452
ldr x2, [x29, 112]
add w1, w0, 1
str w1, [x2]
-.L443:
+.L452:
ldrh w1, [x27]
mov w2, 61604
cmp w1, w2
- beq .L445
- bhi .L446
+ beq .L454
+ bhi .L455
mov w0, 61574
cmp w1, w0
- beq .L447
-.L444:
+ beq .L456
+.L453:
ldr x0, [x29, 128]
add x22, x22, 32
cmp x0, x22
- bne .L471
- b .L472
-.L446:
+ bne .L480
+ b .L481
+.L455:
mov w0, 61634
cmp w1, w0
- beq .L448
+ beq .L457
mov w0, 65535
cmp w1, w0
- bne .L444
+ bne .L453
mov w1, 0
-.L510:
+.L519:
mov w0, w26
bl FtlFreeSysBlkQueueIn
- b .L444
-.L448:
+ b .L453
+.L457:
ldrh w1, [x20, #:lo12:.LANCHOR130]
ldr w0, [x21, #:lo12:.LANCHOR30]
cmp w1, w0
- bls .L450
+ bls .L459
ldr x1, [x29, 136]
adrp x0, .LC1
mov w2, 1225
add x0, x0, :lo12:.LC1
bl printf
-.L450:
+.L459:
ldr w6, [x21, #:lo12:.LANCHOR30]
ldr x3, [x29, 152]
ldrh w1, [x20, #:lo12:.LANCHOR130]
@@ -3684,53 +3703,53 @@ FtlScanSysBlk:
sub w2, w2, #1
ldr x5, [x3, #:lo12:.LANCHOR125]
sxth w2, w2
-.L451:
+.L460:
cmp w0, w2
- bgt .L457
- tbz w0, #31, .L491
- b .L444
-.L457:
+ bgt .L466
+ tbz w0, #31, .L500
+ b .L453
+.L466:
sxtw x8, w0
ldr w11, [x27, 4]
lsl x7, x8, 2
add x10, x5, x7
ldr w7, [x5, x7]
cmp w11, w7
- bls .L452
+ bls .L461
ldr w2, [x5]
- cbnz w2, .L453
+ cbnz w2, .L462
cmp w6, w1
- beq .L453
+ beq .L462
add w1, w1, 1
strh w1, [x20, #:lo12:.LANCHOR130]
-.L453:
+.L462:
ldr x1, [x29, 160]
ldr x6, [x1, #:lo12:.LANCHOR119]
mov w1, 0
-.L454:
+.L463:
cmp w1, w0
- bne .L455
+ bne .L464
ldr w1, [x27, 4]
str w1, [x10]
strh w26, [x6, x8, lsl 1]
- tbnz w0, #31, .L444
+ tbnz w0, #31, .L453
ldrh w1, [x20, #:lo12:.LANCHOR130]
ldr w2, [x21, #:lo12:.LANCHOR30]
sub w2, w2, w1
sub w2, w2, #1
cmp w0, w2, sxth
- bgt .L444
-.L491:
+ bgt .L453
+.L500:
add w1, w1, 1
strh w1, [x20, #:lo12:.LANCHOR130]
ldr w1, [x27, 4]
str w1, [x5, x0, lsl 2]
ldr x1, [x29, 160]
ldr x1, [x1, #:lo12:.LANCHOR119]
-.L509:
+.L518:
strh w26, [x1, x0, lsl 1]
- b .L444
-.L455:
+ b .L453
+.L464:
sxtw x2, w1
add w1, w1, 1
lsl x7, x2, 2
@@ -3742,22 +3761,22 @@ FtlScanSysBlk:
add x7, x6, x2
ldrh w7, [x7, 2]
strh w7, [x6, x2]
- b .L454
-.L452:
+ b .L463
+.L461:
sub w0, w0, #1
sxth x0, w0
- b .L451
-.L447:
+ b .L460
+.L456:
ldrh w1, [x23, #:lo12:.LANCHOR35]
ldrh w0, [x19, #:lo12:.LANCHOR27]
cmp w1, w0
- bls .L460
+ bls .L469
ldr x1, [x29, 136]
adrp x0, .LC1
mov w2, 1266
add x0, x0, :lo12:.LC1
bl printf
-.L460:
+.L469:
ldrh w6, [x19, #:lo12:.LANCHOR27]
ldrh w2, [x23, #:lo12:.LANCHOR35]
sub w1, w6, #1
@@ -3765,46 +3784,46 @@ FtlScanSysBlk:
sub w5, w1, w2
ldr x1, [x29, 144]
ldr x1, [x1, #:lo12:.LANCHOR122]
-.L461:
+.L470:
cmp w0, w5
- ble .L466
+ ble .L475
sxtw x7, w0
ldr w11, [x27, 4]
lsl x8, x7, 2
add x10, x1, x8
ldr w8, [x1, x8]
cmp w11, w8
- bls .L462
+ bls .L471
ldr w5, [x1]
- cbnz w5, .L463
+ cbnz w5, .L472
cmp w6, w2
- beq .L463
+ beq .L472
add w2, w2, 1
strh w2, [x23, #:lo12:.LANCHOR35]
-.L463:
+.L472:
ldr x6, [x28, #:lo12:.LANCHOR36]
mov w2, 0
-.L464:
+.L473:
cmp w2, w0
- bne .L465
+ bne .L474
ldr w2, [x27, 4]
str w2, [x10]
strh w26, [x6, x7, lsl 1]
-.L466:
- tbnz w0, #31, .L444
+.L475:
+ tbnz w0, #31, .L453
ldrh w2, [x19, #:lo12:.LANCHOR27]
ldrh w5, [x23, #:lo12:.LANCHOR35]
sub w2, w2, #1
sub w2, w2, w5
cmp w0, w2, sxth
- bgt .L444
+ bgt .L453
add w5, w5, 1
ldr w2, [x27, 4]
strh w5, [x23, #:lo12:.LANCHOR35]
str w2, [x1, x0, lsl 2]
ldr x1, [x28, #:lo12:.LANCHOR36]
- b .L509
-.L465:
+ b .L518
+.L474:
sxtw x5, w2
add w2, w2, 1
lsl x8, x5, 2
@@ -3816,61 +3835,61 @@ FtlScanSysBlk:
add x8, x6, x5
ldrh w8, [x8, 2]
strh w8, [x6, x5]
- b .L464
-.L462:
+ b .L473
+.L471:
sub w0, w0, #1
sxth x0, w0
- b .L461
-.L445:
+ b .L470
+.L454:
ldrh w5, [x24, #:lo12:.LANCHOR139]
mov w1, 65535
add x2, x24, :lo12:.LANCHOR139
cmp w5, w1
- bne .L468
+ bne .L477
strh w26, [x24, #:lo12:.LANCHOR139]
str w0, [x2, 8]
- b .L444
-.L468:
+ b .L453
+.L477:
ldrh w0, [x2, 4]
cmp w0, w1
- beq .L469
+ beq .L478
mov w1, 1
bl FtlFreeSysBlkQueueIn
-.L469:
+.L478:
add x0, x24, :lo12:.LANCHOR139
ldr w1, [x27, 4]
ldr w2, [x0, 8]
cmp w2, w1
- bcs .L470
+ bcs .L479
ldrh w2, [x24, #:lo12:.LANCHOR139]
strh w2, [x0, 4]
strh w26, [x24, #:lo12:.LANCHOR139]
str w1, [x0, 8]
- b .L444
-.L470:
+ b .L453
+.L479:
strh w26, [x0, 4]
- b .L444
-.L473:
+ b .L453
+.L482:
ldr x0, [x29, 160]
ldr x2, [x0, #:lo12:.LANCHOR119]
ldrh w0, [x2]
- cbz w0, .L475
-.L478:
+ cbz w0, .L484
+.L487:
ldr x1, [x28, #:lo12:.LANCHOR36]
ldrh w0, [x1]
- cbz w0, .L476
-.L477:
+ cbz w0, .L485
+.L486:
ldrh w1, [x20, #:lo12:.LANCHOR130]
ldr w0, [x21, #:lo12:.LANCHOR30]
cmp w1, w0
- bls .L507
+ bls .L516
adrp x1, .LANCHOR140
adrp x0, .LC1
mov w2, 1391
add x1, x1, :lo12:.LANCHOR140
add x0, x0, :lo12:.LC1
bl printf
-.L507:
+.L516:
ldp x19, x20, [sp, 16]
mov w0, 0
ldp x21, x22, [sp, 32]
@@ -3879,24 +3898,24 @@ FtlScanSysBlk:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 176
ret
-.L475:
+.L484:
ldrh w0, [x20, #:lo12:.LANCHOR130]
- cbz w0, .L478
+ cbz w0, .L487
ldr w1, [x21, #:lo12:.LANCHOR30]
mov w0, 0
-.L479:
+.L488:
cmp w0, w1
- bcs .L478
+ bcs .L487
ldrh w3, [x2, w0, sxtw 1]
- cbz w3, .L480
+ cbz w3, .L489
ldr x1, [x29, 152]
add x7, x21, :lo12:.LANCHOR30
ldr x4, [x1, #:lo12:.LANCHOR125]
mov w1, w0
-.L481:
+.L490:
ldr w3, [x7]
cmp w1, w3
- bcs .L478
+ bcs .L487
sxtw x6, w1
sub w3, w1, w0
lsl x5, x6, 1
@@ -3908,29 +3927,29 @@ FtlScanSysBlk:
strh w8, [x2, x3, lsl 1]
str w6, [x4, x3, lsl 2]
strh wzr, [x2, x5]
- b .L481
-.L480:
+ b .L490
+.L489:
add w0, w0, 1
sxth w0, w0
- b .L479
-.L476:
+ b .L488
+.L485:
ldrh w0, [x23, #:lo12:.LANCHOR35]
- cbz w0, .L477
+ cbz w0, .L486
ldrh w2, [x19, #:lo12:.LANCHOR27]
mov w0, 0
-.L486:
+.L495:
mov w6, w0
cmp w0, w2
- bge .L477
+ bge .L486
ldrh w3, [x1, w0, sxtw 1]
- cbz w3, .L487
+ cbz w3, .L496
ldr x2, [x29, 144]
add x19, x19, :lo12:.LANCHOR27
ldr x3, [x2, #:lo12:.LANCHOR122]
-.L488:
+.L497:
ldrh w2, [x19]
cmp w0, w2
- bge .L477
+ bge .L486
sxtw x5, w0
sub w2, w0, w6
lsl x4, x5, 1
@@ -3942,11 +3961,11 @@ FtlScanSysBlk:
strh w7, [x1, x2, lsl 1]
str w5, [x3, x2, lsl 2]
strh wzr, [x1, x4]
- b .L488
-.L487:
+ b .L497
+.L496:
add w0, w0, 1
sxth w0, w0
- b .L486
+ b .L495
.size FtlScanSysBlk, .-FtlScanSysBlk
.section .text.FtlLoadBbt,"ax",@progbits
.align 2
@@ -3974,11 +3993,11 @@ FtlLoadBbt:
add x24, x24, :lo12:.LANCHOR17
sub w19, w19, #1
and w19, w19, 65535
-.L512:
+.L521:
ldrh w0, [x24]
sub w0, w0, #15
cmp w0, w19
- bgt .L515
+ bgt .L524
lsl w0, w19, 10
mov w2, 1
str w0, [x20, 4]
@@ -3987,7 +4006,7 @@ FtlLoadBbt:
bl FlashReadPages
ldr w0, [x20]
cmn w0, #1
- bne .L513
+ bne .L522
ldr w0, [x20, 4]
mov w2, 1
mov w1, w2
@@ -3995,13 +4014,13 @@ FtlLoadBbt:
str w0, [x20, 4]
mov x0, x20
bl FlashReadPages
-.L513:
+.L522:
ldr w0, [x20]
cmn w0, #1
- beq .L514
+ beq .L523
ldrh w0, [x21]
cmp w0, w25
- bne .L514
+ bne .L523
adrp x1, .LANCHOR37
add x0, x1, :lo12:.LANCHOR37
strh w19, [x1, #:lo12:.LANCHOR37]
@@ -4009,16 +4028,16 @@ FtlLoadBbt:
str w1, [x0, 8]
ldrh w1, [x21, 8]
strh w1, [x0, 4]
-.L515:
+.L524:
adrp x19, .LANCHOR37
mov w0, 65535
add x20, x19, :lo12:.LANCHOR37
ldrh w1, [x19, #:lo12:.LANCHOR37]
cmp w1, w0
- beq .L529
+ beq .L538
ldrh w1, [x20, 4]
cmp w1, w0
- beq .L519
+ beq .L528
add x0, x22, :lo12:.LANCHOR138
lsl w1, w1, 10
mov w2, 1
@@ -4027,21 +4046,21 @@ FtlLoadBbt:
bl FlashReadPages
ldr w0, [x22, #:lo12:.LANCHOR138]
cmn w0, #1
- beq .L519
+ beq .L528
ldrh w1, [x21]
mov w0, 61649
cmp w1, w0
- bne .L519
+ bne .L528
ldr w1, [x20, 8]
ldr w0, [x21, 4]
cmp w0, w1
- bls .L519
+ bls .L528
ldrh w1, [x20, 4]
str w0, [x20, 8]
ldrh w0, [x21, 8]
strh w1, [x19, #:lo12:.LANCHOR37]
strh w0, [x20, 4]
-.L519:
+.L528:
ldrh w0, [x19, #:lo12:.LANCHOR37]
add x24, x19, :lo12:.LANCHOR37
mov w1, 1
@@ -4051,35 +4070,35 @@ FtlLoadBbt:
add w0, w0, 1
strh w0, [x24, 2]
add x24, x22, :lo12:.LANCHOR138
-.L521:
- tbz w20, #31, .L524
+.L530:
+ tbz w20, #31, .L533
adrp x1, .LANCHOR141
adrp x0, .LC1
- mov w2, 253
+ mov w2, 251
add x1, x1, :lo12:.LANCHOR141
add x0, x0, :lo12:.LC1
bl printf
-.L523:
+.L532:
add x0, x19, :lo12:.LANCHOR37
ldrh w1, [x21, 10]
strh w1, [x0, 6]
mov w1, 65535
ldrh w0, [x21, 12]
cmp w0, w1
- beq .L526
+ beq .L535
adrp x1, .LANCHOR2
ldr w2, [x1, #:lo12:.LANCHOR2]
cmp w0, w2
- beq .L526
+ beq .L535
adrp x1, .LANCHOR6
ldrh w1, [x1, #:lo12:.LANCHOR6]
lsr w1, w1, 2
cmp w2, w1
- bcs .L526
+ bcs .L535
cmp w0, w1
- bcs .L526
+ bcs .L535
bl FtlSysBlkNumInit
-.L526:
+.L535:
add x19, x19, :lo12:.LANCHOR37
adrp x21, .LANCHOR10
adrp x23, .LANCHOR127
@@ -4088,23 +4107,23 @@ FtlLoadBbt:
add x23, x23, :lo12:.LANCHOR127
add x22, x22, :lo12:.LANCHOR138
mov w20, 0
-.L527:
+.L536:
ldrh w0, [x21]
cmp w20, w0
- bcc .L528
+ bcc .L537
mov w0, 0
-.L511:
+.L520:
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
-.L514:
+.L523:
sub w19, w19, #1
and w19, w19, 65535
- b .L512
-.L524:
+ b .L521
+.L533:
ldrh w0, [x19, #:lo12:.LANCHOR37]
mov w2, 1
mov w1, w2
@@ -4116,15 +4135,15 @@ FtlLoadBbt:
bl FlashReadPages
ldr w0, [x24]
cmn w0, #1
- beq .L522
+ beq .L531
ldrh w0, [x21]
cmp w0, w25
- beq .L523
-.L522:
+ beq .L532
+.L531:
sub w20, w20, #1
sxth w20, w20
- b .L521
-.L528:
+ b .L530
+.L537:
ldrh w2, [x23]
ldr x0, [x22, 8]
mul w1, w2, w20
@@ -4133,10 +4152,10 @@ FtlLoadBbt:
add x1, x0, x1, lsl 2
ldr x0, [x19], 8
bl ftl_memcpy
- b .L527
-.L529:
+ b .L536
+.L538:
mov w0, -1
- b .L511
+ b .L520
.size FtlLoadBbt, .-FtlLoadBbt
.section .text.FlashProgPages,"ax",@progbits
.align 2
@@ -4163,18 +4182,18 @@ FlashProgPages:
mov x25, x0
add x28, x24, :lo12:.LANCHOR78
lsl w27, w23, 3
-.L542:
+.L551:
cmp x25, x20
- bne .L555
+ bne .L564
ldr w0, [x29, 104]
- cbz w0, .L568
+ cbz w0, .L578
adrp x21, .LANCHOR111
adrp x22, .LANCHOR113
mov x23, x21
mov x24, x22
-.L557:
+.L566:
cmp x19, x20
- beq .L568
+ beq .L578
ldr x1, [x21, #:lo12:.LANCHOR111]
ldr x0, [x22, #:lo12:.LANCHOR113]
str wzr, [x1]
@@ -4188,78 +4207,87 @@ FlashProgPages:
bl FlashReadPages
ldr w26, [x29, 128]
cmn w26, #1
- bne .L558
+ bne .L567
ldr w1, [x19, 4]
- adrp x0, .LC11
- add x0, x0, :lo12:.LC11
+ adrp x0, .LC14
+ add x0, x0, :lo12:.LC14
bl printf
str w26, [x19]
-.L558:
+.L567:
+ ldr w26, [x29, 128]
+ cmp w26, 256
+ bne .L568
+ ldr w1, [x19, 4]
+ adrp x0, .LC15
+ add x0, x0, :lo12:.LC15
+ bl printf
+ str w26, [x19]
+.L568:
ldr x0, [x19, 16]
- cbz x0, .L559
+ cbz x0, .L569
ldr w2, [x0]
ldr x0, [x24, #:lo12:.LANCHOR113]
ldr w3, [x0]
cmp w2, w3
- beq .L559
+ beq .L569
ldr w1, [x19, 4]
- adrp x0, .LC12
- add x0, x0, :lo12:.LC12
+ adrp x0, .LC16
+ add x0, x0, :lo12:.LC16
bl printf
mov w0, -1
str w0, [x19]
-.L559:
+.L569:
ldr x0, [x19, 8]
- cbz x0, .L560
+ cbz x0, .L570
ldr w2, [x0]
ldr x0, [x23, #:lo12:.LANCHOR111]
ldr w3, [x0]
cmp w2, w3
- beq .L560
+ beq .L570
ldr w1, [x19, 4]
- adrp x0, .LC13
- add x0, x0, :lo12:.LC13
+ adrp x0, .LC17
+ add x0, x0, :lo12:.LC17
bl printf
mov w0, -1
str w0, [x19]
-.L560:
+.L570:
add x19, x19, 32
- b .L557
-.L555:
+ b .L566
+.L564:
ldr x0, [x25, 8]
- cbz x0, .L543
+ cbz x0, .L552
ldr x0, [x25, 16]
- cbnz x0, .L544
-.L543:
+ cbnz x0, .L553
+.L552:
adrp x0, .LC1
- mov w2, 134
+ mov w2, 142
mov x1, x22
add x0, x0, :lo12:.LC1
bl printf
-.L544:
+.L553:
ldr w0, [x25, 4]
add x2, x29, 120
add x1, x29, 124
bl l2p_addr_tran.isra.0
ldr w0, [x29, 120]
cmp w0, 3
- bls .L545
-.L581:
+ bls .L554
+.L591:
mov w0, -1
str w0, [x25]
- b .L546
-.L545:
- cbnz w0, .L547
+ b .L555
+.L554:
+ cbnz w0, .L556
ldr w0, [x29, 124]
cmp w27, w0
- bls .L547
+ bls .L556
adrp x21, .LANCHOR142
adrp x22, .LC6
mov w23, -1
add x21, x21, :lo12:.LANCHOR142
add x22, x22, :lo12:.LC6
- b .L579
-.L549:
+ b .L589
+.L558:
ldr w2, [x19, 4]
mov x1, x21
str w23, [x19]
@@ -4278,10 +4306,10 @@ FlashProgPages:
mov w2, w3
add x0, x0, :lo12:.LC8
bl rknand_print_hex
-.L579:
+.L589:
cmp x19, x20
- bne .L549
-.L568:
+ bne .L558
+.L578:
ldp x19, x20, [sp, 16]
mov w0, 0
ldp x21, x22, [sp, 32]
@@ -4290,20 +4318,20 @@ FlashProgPages:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 160
ret
-.L547:
+.L556:
ldr x1, [x25, 8]
tst x1, 63
- beq .L562
+ beq .L572
adrp x0, .LANCHOR111
ldr x26, [x0, #:lo12:.LANCHOR111]
cmp x1, x26
- beq .L550
+ beq .L559
adrp x0, .LANCHOR12
ldrh w2, [x0, #:lo12:.LANCHOR12]
mov x0, x26
lsl w2, w2, 9
bl ftl_memcpy
-.L550:
+.L559:
add x0, x24, :lo12:.LANCHOR78
ldr w1, [x29, 124]
ldr x3, [x25, 16]
@@ -4311,13 +4339,13 @@ FlashProgPages:
ldr x6, [x0, 16]
ldrb w0, [x29, 120]
blr x6
- cbnz w0, .L551
+ cbnz w0, .L560
str wzr, [x25]
-.L552:
+.L561:
add x0, x21, :lo12:.LANCHOR0
ldrh w0, [x0, 14]
cmp w0, 4
- bne .L546
+ bne .L555
ldrb w0, [x29, 120]
add x2, x26, 2048
ldr x6, [x28, 16]
@@ -4326,17 +4354,17 @@ FlashProgPages:
add w1, w23, w1
add x3, x3, 8
blr x6
- cbnz w0, .L581
-.L546:
+ cbnz w0, .L591
+.L555:
add x25, x25, 32
- b .L542
-.L562:
+ b .L551
+.L572:
mov x26, x1
- b .L550
-.L551:
+ b .L559
+.L560:
mov w0, -1
str w0, [x25]
- b .L552
+ b .L561
.size FlashProgPages, .-FlashProgPages
.section .text.FtlLowFormatEraseBlock,"ax",@progbits
.align 2
@@ -4370,43 +4398,43 @@ FtlLowFormatEraseBlock:
ldrh w12, [x25, #:lo12:.LANCHOR24]
stp x27, x28, [sp, 80]
str x0, [x29, 112]
-.L583:
+.L593:
cmp w8, w5, uxth
- bhi .L587
- cbz w24, .L582
+ bhi .L597
+ cbz w24, .L592
mov w2, w24
ubfiz x24, x24, 5, 16
mov x26, 0
mov w1, 0
mov x0, x6
bl FlashEraseBlocks
-.L591:
+.L601:
ldr x0, [x21, #:lo12:.LANCHOR79]
add x1, x0, x26
ldr w0, [x0, x26]
cmn w0, #1
- bne .L590
+ bne .L600
ldr w0, [x1, 4]
add w19, w19, 1
and w19, w19, 65535
lsr w0, w0, 10
bl FtlBbmMapBadBlock
-.L590:
+.L600:
add x26, x26, 32
cmp x26, x24
- bne .L591
- cbz w22, .L604
+ bne .L601
+ cbz w22, .L614
adrp x0, .LANCHOR20
mov w26, 1
ldrh w28, [x0, #:lo12:.LANCHOR20]
-.L592:
+.L602:
add x0, x20, :lo12:.LANCHOR3
adrp x27, .LANCHOR13
str x0, [x29, 120]
mov w24, 0
add x0, x27, :lo12:.LANCHOR13
str x0, [x29, 104]
-.L600:
+.L610:
ldr x0, [x29, 120]
mov x5, 0
ldr x6, [x21, #:lo12:.LANCHOR79]
@@ -4417,10 +4445,10 @@ FtlLowFormatEraseBlock:
ldr x8, [x0, #:lo12:.LANCHOR109]
ldr x0, [x29, 112]
ldr x10, [x0, #:lo12:.LANCHOR110]
-.L593:
+.L603:
cmp w7, w5, uxth
- bhi .L596
- cbz w20, .L582
+ bhi .L606
+ cbz w20, .L592
mov w1, w20
mov w3, 1
mov w2, w26
@@ -4428,11 +4456,11 @@ FtlLowFormatEraseBlock:
bl FlashProgPages
mov x27, 0
ubfiz x1, x20, 5, 16
-.L599:
+.L609:
ldr x0, [x21, #:lo12:.LANCHOR79]
add x3, x0, x27
ldr w0, [x0, x27]
- cbz w0, .L598
+ cbz w0, .L608
ldr w0, [x3, 4]
add w19, w19, 1
str x1, [x29, 96]
@@ -4440,36 +4468,36 @@ FtlLowFormatEraseBlock:
lsr w0, w0, 10
bl FtlBbmMapBadBlock
ldr x1, [x29, 96]
-.L598:
+.L608:
add x27, x27, 32
cmp x1, x27
- bne .L599
+ bne .L609
add w24, w24, 1
cmp w28, w24, uxth
- bhi .L600
+ bhi .L610
mov x24, 0
-.L602:
- cbz w22, .L601
+.L612:
+ cbz w22, .L611
ldr x0, [x21, #:lo12:.LANCHOR79]
add x1, x0, x24
ldr w0, [x0, x24]
- cbnz w0, .L601
+ cbnz w0, .L611
ldr w0, [x1, 4]
mov w1, 1
lsr w0, w0, 10
bl FtlFreeSysBlkQueueIn
-.L601:
+.L611:
add x24, x24, 32
cmp x24, x27
- bne .L602
+ bne .L612
cmp w23, 63
ccmp w22, 0, 0, hi
- beq .L582
+ beq .L592
ldr x0, [x21, #:lo12:.LANCHOR79]
mov w2, w20
mov w1, w26
bl FlashEraseBlocks
-.L582:
+.L592:
mov w0, w19
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
@@ -4478,7 +4506,7 @@ FtlLowFormatEraseBlock:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 128
ret
-.L587:
+.L597:
lsl x0, x5, 5
mov w1, w23
str wzr, [x6, x0]
@@ -4486,13 +4514,13 @@ FtlLowFormatEraseBlock:
bl V2P_block
and w13, w0, 65535
mov w14, w13
- cbz w22, .L584
+ cbz w22, .L594
bl IsBlkInVendorPart
- cbnz w0, .L585
-.L584:
+ cbnz w0, .L595
+.L594:
mov w0, w14
bl FtlBbmIsBadBlock
- cbnz w0, .L586
+ cbnz w0, .L596
ubfiz x0, x24, 5, 16
mul w1, w24, w12
add x0, x6, x0
@@ -4503,18 +4531,18 @@ FtlLowFormatEraseBlock:
add x1, x11, x1, sxtw 2
str w13, [x0, 4]
stp x10, x1, [x0, 8]
-.L585:
+.L595:
add x5, x5, 1
- b .L583
-.L586:
+ b .L593
+.L596:
add w19, w19, 1
and w19, w19, 65535
- b .L585
-.L604:
+ b .L595
+.L614:
mov w26, 0
mov w28, 2
- b .L592
-.L596:
+ b .L602
+.L606:
lsl x0, x5, 5
mov w1, w23
str wzr, [x6, x0]
@@ -4523,13 +4551,13 @@ FtlLowFormatEraseBlock:
bl V2P_block
and w12, w0, 65535
mov w13, w12
- cbz w22, .L594
+ cbz w22, .L604
bl IsBlkInVendorPart
- cbnz w0, .L595
-.L594:
+ cbnz w0, .L605
+.L604:
mov w0, w13
bl FtlBbmIsBadBlock
- cbnz w0, .L595
+ cbnz w0, .L605
ubfiz x0, x20, 5, 16
mul w1, w20, w11
add x0, x6, x0
@@ -4540,9 +4568,9 @@ FtlLowFormatEraseBlock:
add x1, x10, x1, sxtw 2
str w12, [x0, 4]
stp x8, x1, [x0, 8]
-.L595:
+.L605:
add x5, x5, 1
- b .L593
+ b .L603
.size FtlLowFormatEraseBlock, .-FtlLowFormatEraseBlock
.section .text.FlashTestBlk,"ax",@progbits
.align 2
@@ -4554,7 +4582,7 @@ FlashTestBlk:
stp x19, x20, [sp, 16]
and w19, w0, 65535
cmp w19, 11
- bls .L628
+ bls .L638
adrp x20, .LANCHOR112
mov w2, 32
mov w1, 165
@@ -4579,7 +4607,7 @@ FlashTestBlk:
mov w1, w3
bl FlashProgPages
ldr w0, [x29, 32]
- cbnz w0, .L629
+ cbnz w0, .L639
add w0, w19, 1
mov w3, 1
str w0, [x29, 36]
@@ -4590,23 +4618,23 @@ FlashTestBlk:
ldr w0, [x29, 32]
cmp w0, 0
csetm w20, ne
-.L627:
+.L637:
mov w2, 1
mov w1, 0
add x0, x29, 32
str w19, [x29, 36]
bl FlashEraseBlocks
-.L625:
+.L635:
mov w0, w20
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 128
ret
-.L629:
+.L639:
mov w20, -1
- b .L627
-.L628:
+ b .L637
+.L638:
mov w20, 0
- b .L625
+ b .L635
.size FlashTestBlk, .-FlashTestBlk
.section .text.FtlBbmTblFlush,"ax",@progbits
.align 2
@@ -4639,20 +4667,20 @@ FtlBbmTblFlush:
add x27, x27, :lo12:.LANCHOR127
mov w1, 0
bl ftl_memset
-.L632:
+.L642:
ldrh w0, [x26]
cmp w24, w0
- blt .L633
+ blt .L643
add x20, x20, :lo12:.LANCHOR138
add x19, x21, :lo12:.LANCHOR37
mov w2, 16
mov w1, 255
- adrp x24, .LC14
+ adrp x25, .LC18
adrp x26, .LANCHOR20
ldr x27, [x20, 16]
- add x24, x24, :lo12:.LC14
+ add x25, x25, :lo12:.LC18
add x26, x26, :lo12:.LANCHOR20
- mov w25, 0
+ mov w24, 0
mov x0, x27
bl ftl_memset
mov w0, -3887
@@ -4669,7 +4697,10 @@ FtlBbmTblFlush:
adrp x0, .LANCHOR2
ldr w0, [x0, #:lo12:.LANCHOR2]
strh w0, [x27, 12]
-.L634:
+ adrp x0, .LANCHOR143
+ ldr w0, [x0, #:lo12:.LANCHOR143]
+ strh w0, [x27, 14]
+.L644:
ldrh w1, [x19]
ldrh w4, [x27, 10]
ldrh w2, [x19, 2]
@@ -4681,13 +4712,13 @@ FtlBbmTblFlush:
orr w0, w2, w1, lsl 10
str wzr, [x20]
str w0, [x20, 4]
- mov x0, x24
+ mov x0, x25
bl printf
ldrh w0, [x26]
ldrh w1, [x19, 2]
sub w0, w0, #1
cmp w1, w0
- blt .L635
+ blt .L645
ldr w0, [x19, 8]
mov w2, 1
ldrh w1, [x19, 4]
@@ -4706,7 +4737,7 @@ FtlBbmTblFlush:
str w1, [x0, 4]
mov w1, w2
bl FlashEraseBlocks
-.L635:
+.L645:
mov w3, 1
mov x0, x20
mov w2, w3
@@ -4717,23 +4748,23 @@ FtlBbmTblFlush:
strh w0, [x19, 2]
ldr w0, [x20]
cmn w0, #1
- bne .L636
+ bne .L646
ldr w1, [x20, 4]
add w21, w21, 1
- adrp x0, .LC15
+ adrp x0, .LC19
and w21, w21, 65535
- add x0, x0, :lo12:.LC15
+ add x0, x0, :lo12:.LC19
bl printf
cmp w21, 3
- bls .L634
+ bls .L644
ldr w1, [x20, 4]
- adrp x0, .LC16
+ adrp x0, .LC20
mov w2, w21
- add x0, x0, :lo12:.LC16
+ add x0, x0, :lo12:.LC20
bl printf
-.L638:
- b .L638
-.L633:
+.L648:
+ b .L648
+.L643:
ldrh w2, [x27]
ldr x1, [x25], 8
ldr x0, [x19, 8]
@@ -4742,12 +4773,13 @@ FtlBbmTblFlush:
add w24, w24, 1
add x0, x0, x3, sxtw 2
bl ftl_memcpy
- b .L632
-.L639:
- mov w25, 1
- b .L634
-.L636:
- cbz w25, .L639
+ b .L642
+.L646:
+ add w24, w24, 1
+ cmp w24, 1
+ beq .L644
+ cmp w0, 256
+ beq .L644
mov w0, 0
ldr x27, [sp, 80]
ldp x19, x20, [sp, 16]
@@ -4769,13 +4801,13 @@ allocate_data_superblock:
stp x23, x24, [sp, 48]
add x24, x28, :lo12:.LANCHOR48
stp x19, x20, [sp, 16]
- adrp x27, .LANCHOR45
+ adrp x27, .LANCHOR44
mov x19, x0
stp x21, x22, [sp, 32]
- add x0, x27, :lo12:.LANCHOR45
+ add x0, x27, :lo12:.LANCHOR44
stp x25, x26, [sp, 64]
str x0, [x29, 104]
-.L642:
+.L657:
ldr x1, [x29, 104]
adrp x23, .LANCHOR5
ldrh w0, [x28, #:lo12:.LANCHOR48]
@@ -4783,18 +4815,18 @@ allocate_data_superblock:
add w0, w0, w1
ldrh w1, [x23, #:lo12:.LANCHOR5]
cmp w0, w1
- ble .L643
- adrp x1, .LANCHOR143
+ ble .L658
+ adrp x1, .LANCHOR144
adrp x0, .LC1
- mov w2, 2661
- add x1, x1, :lo12:.LANCHOR143
+ mov w2, 2656
+ add x1, x1, :lo12:.LANCHOR144
add x0, x0, :lo12:.LC1
bl printf
-.L643:
+.L658:
adrp x0, .LANCHOR53
add x0, x0, :lo12:.LANCHOR53
cmp x19, x0
- bne .L669
+ bne .L684
adrp x1, .LANCHOR95
ldrh w0, [x24]
ldr w1, [x1, #:lo12:.LANCHOR95]
@@ -4803,74 +4835,74 @@ allocate_data_superblock:
add w0, w0, 1
add w1, w0, w1, lsr 2
ands w1, w1, 65535
- beq .L644
+ beq .L659
sub w1, w1, #1
and w1, w1, 65535
-.L644:
- adrp x0, .LANCHOR47
- add x0, x0, :lo12:.LANCHOR47
+.L659:
+ adrp x0, .LANCHOR46
+ add x0, x0, :lo12:.LANCHOR46
bl List_pop_index_node
and w22, w0, 65535
ldrh w0, [x24]
- cbnz w0, .L645
- adrp x1, .LANCHOR143
+ cbnz w0, .L660
+ adrp x1, .LANCHOR144
adrp x0, .LC1
- mov w2, 2670
- add x1, x1, :lo12:.LANCHOR143
+ mov w2, 2665
+ add x1, x1, :lo12:.LANCHOR144
add x0, x0, :lo12:.LC1
bl printf
-.L645:
+.L660:
ldrh w0, [x24]
sub w0, w0, #1
strh w0, [x24]
ldrh w0, [x23, #:lo12:.LANCHOR5]
cmp w0, w22
- bls .L642
+ bls .L657
adrp x25, .LANCHOR42
ubfiz x20, x22, 1, 16
ldr x0, [x25, #:lo12:.LANCHOR42]
ldrh w21, [x0, x20]
- cbnz w21, .L642
+ cbnz w21, .L657
strh w22, [x19]
mov x0, x19
bl make_superblock
ldrb w0, [x19, 7]
- cbnz w0, .L647
+ cbnz w0, .L662
ldr x0, [x25, #:lo12:.LANCHOR42]
mov w1, -1
strh w1, [x0, x20]
mov w0, w22
bl INSERT_DATA_LIST
- ldrh w1, [x27, #:lo12:.LANCHOR45]
+ ldrh w1, [x27, #:lo12:.LANCHOR44]
ldrh w0, [x24]
add w0, w0, w1
ldrh w1, [x23, #:lo12:.LANCHOR5]
cmp w0, w1
- ble .L642
- mov w2, 2684
- adrp x1, .LANCHOR143
+ ble .L657
+ mov w2, 2679
+ adrp x1, .LANCHOR144
adrp x0, .LC1
- add x1, x1, :lo12:.LANCHOR143
+ add x1, x1, :lo12:.LANCHOR144
add x0, x0, :lo12:.LC1
bl printf
- b .L642
-.L669:
+ b .L657
+.L684:
mov w1, 0
- b .L644
-.L647:
- ldrh w1, [x27, #:lo12:.LANCHOR45]
+ b .L659
+.L662:
+ ldrh w1, [x27, #:lo12:.LANCHOR44]
ldrh w0, [x24]
add w0, w0, w1
ldrh w1, [x23, #:lo12:.LANCHOR5]
cmp w0, w1
- ble .L649
- adrp x1, .LANCHOR143
+ ble .L664
+ adrp x1, .LANCHOR144
adrp x0, .LC1
- mov w2, 2687
- add x1, x1, :lo12:.LANCHOR143
+ mov w2, 2682
+ add x1, x1, :lo12:.LANCHOR144
add x0, x0, :lo12:.LC1
bl printf
-.L649:
+.L664:
adrp x0, .LANCHOR3
adrp x25, .LANCHOR79
add x26, x19, 16
@@ -4882,40 +4914,40 @@ allocate_data_superblock:
add x1, x3, 8
add x0, x0, 8
add x0, x3, x0
-.L650:
+.L665:
cmp x0, x1
- bne .L652
- cbnz w21, .L653
- adrp x1, .LANCHOR143
+ bne .L667
+ cbnz w21, .L668
+ adrp x1, .LANCHOR144
adrp x0, .LC1
- mov w2, 2698
- add x1, x1, :lo12:.LANCHOR143
+ mov w2, 2693
+ add x1, x1, :lo12:.LANCHOR144
add x0, x0, :lo12:.LC1
bl printf
-.L653:
- adrp x0, .LANCHOR144
- ldrh w0, [x0, #:lo12:.LANCHOR144]
+.L668:
+ adrp x0, .LANCHOR145
+ ldrh w0, [x0, #:lo12:.LANCHOR145]
cmp w0, w22
- bne .L654
- adrp x1, .LANCHOR143
+ bne .L669
+ adrp x1, .LANCHOR144
adrp x0, .LC1
- mov w2, 2700
- add x1, x1, :lo12:.LANCHOR143
+ mov w2, 2695
+ add x1, x1, :lo12:.LANCHOR144
add x0, x0, :lo12:.LC1
bl printf
-.L654:
+.L669:
ldrb w0, [x19, 8]
- adrp x6, .LANCHOR43
+ adrp x6, .LANCHOR47
adrp x7, .LANCHOR14
adrp x5, .LANCHOR90
adrp x4, .LANCHOR91
- ldr x1, [x6, #:lo12:.LANCHOR43]
- cbnz w0, .L655
+ ldr x1, [x6, #:lo12:.LANCHOR47]
+ cbnz w0, .L670
ldrh w0, [x1, x20]
- cbz w0, .L656
+ cbz w0, .L671
ldrh w2, [x7, #:lo12:.LANCHOR14]
add w0, w0, w2
-.L680:
+.L695:
strh w0, [x1, x20]
mov w1, 0
ldr w0, [x5, #:lo12:.LANCHOR90]
@@ -4923,23 +4955,23 @@ allocate_data_superblock:
str w0, [x5, #:lo12:.LANCHOR90]
mov w0, w22
bl ftl_set_blk_mode
-.L658:
- ldr x0, [x6, #:lo12:.LANCHOR43]
+.L673:
+ ldr x0, [x6, #:lo12:.LANCHOR47]
ldrh w1, [x0, x20]
adrp x0, .LANCHOR92
ldr w2, [x0, #:lo12:.LANCHOR92]
cmp w1, w2
- bls .L659
+ bls .L674
str w1, [x0, #:lo12:.LANCHOR92]
-.L659:
+.L674:
ldr w2, [x5, #:lo12:.LANCHOR90]
ldr w1, [x4, #:lo12:.LANCHOR91]
ldrh w0, [x7, #:lo12:.LANCHOR14]
madd w0, w0, w2, w1
ldrh w1, [x23, #:lo12:.LANCHOR5]
udiv w0, w0, w1
- adrp x1, .LANCHOR145
- str w0, [x1, #:lo12:.LANCHOR145]
+ adrp x1, .LANCHOR143
+ str w0, [x1, #:lo12:.LANCHOR143]
adrp x0, .LANCHOR118
ldr x1, [x0, #:lo12:.LANCHOR118]
ldr w0, [x1, 16]
@@ -4950,48 +4982,48 @@ allocate_data_superblock:
add x1, x1, 4
add x2, x0, 4
add x1, x0, x1
-.L660:
+.L675:
cmp x1, x2
- bne .L661
+ bne .L676
ldrb w1, [x19, 8]
mov w2, w21
mov x23, 0
bl FlashEraseBlocks
mov w1, 0
-.L662:
+.L677:
cmp w21, w23, uxth
- bhi .L664
- cbz w1, .L665
+ bhi .L679
+ cbz w1, .L680
mov w0, w22
bl update_multiplier_value
bl FtlBbmTblFlush
-.L665:
+.L680:
ldrb w0, [x19, 7]
- cbnz w0, .L666
+ cbnz w0, .L681
adrp x0, .LANCHOR42
mov w1, -1
ldr x0, [x0, #:lo12:.LANCHOR42]
strh w1, [x0, x20]
- b .L642
-.L652:
+ b .L657
+.L667:
ldrh w2, [x4]
stp xzr, xzr, [x1]
cmp w2, w6
- beq .L651
+ beq .L666
ubfiz x5, x21, 5, 16
add w21, w21, 1
add x5, x3, x5
and w21, w21, 65535
lsl w2, w2, 10
str w2, [x5, 4]
-.L651:
+.L666:
add x1, x1, 32
add x4, x4, 2
- b .L650
-.L656:
+ b .L665
+.L671:
mov w0, 2
- b .L680
-.L655:
+ b .L695
+.L670:
ldrh w0, [x1, x20]
add w0, w0, 1
strh w0, [x1, x20]
@@ -5000,19 +5032,19 @@ allocate_data_superblock:
str w0, [x4, #:lo12:.LANCHOR91]
mov w0, w22
bl ftl_set_blk_mode.part.6
- b .L658
-.L661:
+ b .L673
+.L676:
ldr w3, [x2]
and w3, w3, -1024
str w3, [x2], 32
- b .L660
-.L664:
+ b .L675
+.L679:
ldr x2, [x25, #:lo12:.LANCHOR79]
lsl x0, x23, 5
add x3, x2, x0
ldr w2, [x2, x0]
cmn w2, #1
- bne .L663
+ bne .L678
add w1, w1, 1
ldr w0, [x3, 4]
stp w2, w1, [x29, 96]
@@ -5023,11 +5055,11 @@ allocate_data_superblock:
ldrb w0, [x19, 7]
sub w0, w0, #1
strb w0, [x19, 7]
-.L663:
+.L678:
add x23, x23, 1
add x26, x26, 2
- b .L662
-.L666:
+ b .L677
+.L681:
adrp x1, .LANCHOR19
adrp x2, .LANCHOR82
strh wzr, [x19, 2]
@@ -5045,17 +5077,17 @@ allocate_data_superblock:
ldr x1, [x1, #:lo12:.LANCHOR42]
strh w0, [x1, x20]
ldrh w0, [x19, 4]
- cbz w0, .L667
+ cbz w0, .L682
ldrb w0, [x19, 7]
- cbnz w0, .L668
-.L667:
- adrp x1, .LANCHOR143
+ cbnz w0, .L683
+.L682:
+ adrp x1, .LANCHOR144
adrp x0, .LC1
- mov w2, 2753
- add x1, x1, :lo12:.LANCHOR143
+ mov w2, 2748
+ add x1, x1, :lo12:.LANCHOR144
add x0, x0, :lo12:.LC1
bl printf
-.L668:
+.L683:
ldp x19, x20, [sp, 16]
mov w0, 0
ldp x21, x22, [sp, 32]
@@ -5080,17 +5112,17 @@ FtlGcFreeBadSuperBlk:
stp x19, x20, [sp, 16]
stp x23, x24, [sp, 48]
str x27, [sp, 80]
- cbz w0, .L682
+ cbz w0, .L697
adrp x23, .LANCHOR75
add x24, x23, :lo12:.LANCHOR75
mov w19, 0
-.L683:
+.L698:
adrp x0, .LANCHOR3
ldrh w0, [x0, #:lo12:.LANCHOR3]
cmp w0, w19
- bhi .L689
+ bhi .L704
bl FtlGcReFreshBadBlk
-.L682:
+.L697:
mov w0, 0
ldr x27, [sp, 80]
ldp x19, x20, [sp, 16]
@@ -5099,7 +5131,7 @@ FtlGcFreeBadSuperBlk:
ldp x25, x26, [sp, 64]
ldp x29, x30, [sp], 96
ret
-.L689:
+.L704:
adrp x0, .LANCHOR13
add x0, x0, :lo12:.LANCHOR13
mov w1, w25
@@ -5108,19 +5140,19 @@ FtlGcFreeBadSuperBlk:
ldrb w0, [x0, w19, sxtw]
bl V2P_block
and w26, w0, 65535
-.L684:
+.L699:
ldrh w0, [x22]
cmp w0, w20
- bhi .L688
+ bhi .L703
add w19, w19, 1
and w19, w19, 65535
- b .L683
-.L688:
+ b .L698
+.L703:
add x0, x23, :lo12:.LANCHOR75
add w27, w20, 1
ldrh w0, [x0, w20, sxtw 1]
cmp w0, w26
- bne .L685
+ bne .L700
mov w0, w26
bl FtlBbmMapBadBlock
bl FtlBbmTblFlush
@@ -5128,22 +5160,22 @@ FtlGcFreeBadSuperBlk:
sxtw x3, w27
and x4, x20, 65535
mov x0, 0
-.L686:
+.L701:
add w2, w20, w0
cmp w1, w2, uxth
- bhi .L687
+ bhi .L702
sub w1, w1, #1
strh w1, [x22]
-.L685:
+.L700:
and w20, w27, 65535
- b .L684
-.L687:
+ b .L699
+.L702:
add x2, x3, x0
ldrh w5, [x24, x2, lsl 1]
add x2, x4, x0
add x0, x0, 1
strh w5, [x24, x2, lsl 1]
- b .L686
+ b .L701
.size FtlGcFreeBadSuperBlk, .-FtlGcFreeBadSuperBlk
.section .text.update_vpc_list,"ax",@progbits
.align 2
@@ -5158,75 +5190,89 @@ update_vpc_list:
ldr x1, [x1, #:lo12:.LANCHOR42]
ubfiz x0, x19, 1, 16
ldrh w0, [x1, x0]
- cbnz w0, .L695
- adrp x0, .LANCHOR144
- ldrh w1, [x0, #:lo12:.LANCHOR144]
+ cbnz w0, .L710
+ adrp x0, .LANCHOR72
+ ldrh w1, [x0, #:lo12:.LANCHOR72]
cmp w1, w19
- bne .L696
+ bne .L711
mov w1, -1
- strh w1, [x0, #:lo12:.LANCHOR144]
-.L697:
- adrp x20, .LANCHOR45
+ strh w1, [x0, #:lo12:.LANCHOR72]
+.L711:
+ adrp x0, .LANCHOR73
+ ldrh w1, [x0, #:lo12:.LANCHOR73]
+ cmp w1, w19
+ bne .L712
+ mov w1, -1
+ strh w1, [x0, #:lo12:.LANCHOR73]
+.L712:
+ adrp x0, .LANCHOR145
+ ldrh w1, [x0, #:lo12:.LANCHOR145]
+ cmp w1, w19
+ bne .L713
+ mov w1, -1
+ strh w1, [x0, #:lo12:.LANCHOR145]
+.L714:
+ adrp x20, .LANCHOR44
mov w1, w19
adrp x0, .LANCHOR41
add x0, x0, :lo12:.LANCHOR41
bl List_remove_node
- ldrh w0, [x20, #:lo12:.LANCHOR45]
- cbnz w0, .L699
+ ldrh w0, [x20, #:lo12:.LANCHOR44]
+ cbnz w0, .L716
adrp x1, .LANCHOR146
adrp x0, .LC1
- mov w2, 2823
+ mov w2, 2824
add x1, x1, :lo12:.LANCHOR146
add x0, x0, :lo12:.LC1
bl printf
-.L699:
- ldrh w0, [x20, #:lo12:.LANCHOR45]
+.L716:
+ ldrh w0, [x20, #:lo12:.LANCHOR44]
sub w0, w0, #1
- strh w0, [x20, #:lo12:.LANCHOR45]
+ strh w0, [x20, #:lo12:.LANCHOR44]
mov w0, w19
bl free_data_superblock
mov w0, w19
bl FtlGcFreeBadSuperBlk
adrp x0, .LANCHOR48
- ldrh w1, [x20, #:lo12:.LANCHOR45]
+ ldrh w1, [x20, #:lo12:.LANCHOR44]
ldrh w0, [x0, #:lo12:.LANCHOR48]
add w0, w0, w1
adrp x1, .LANCHOR5
ldrh w1, [x1, #:lo12:.LANCHOR5]
cmp w0, w1
- ble .L703
+ ble .L720
adrp x1, .LANCHOR146
adrp x0, .LC1
- mov w2, 2826
+ mov w2, 2827
add x1, x1, :lo12:.LANCHOR146
add x0, x0, :lo12:.LC1
bl printf
-.L703:
+.L720:
mov w0, 1
- b .L694
-.L696:
+ b .L709
+.L713:
adrp x0, .LANCHOR51
ldrh w0, [x0, #:lo12:.LANCHOR51]
cmp w0, w19
- beq .L702
+ beq .L719
adrp x0, .LANCHOR52
ldrh w0, [x0, #:lo12:.LANCHOR52]
cmp w0, w19
- beq .L702
+ beq .L719
adrp x0, .LANCHOR53
ldrh w0, [x0, #:lo12:.LANCHOR53]
cmp w0, w19
- bne .L697
-.L702:
+ bne .L714
+.L719:
mov w0, 0
-.L694:
+.L709:
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 32
ret
-.L695:
+.L710:
mov w0, w19
bl List_update_data_list
- b .L702
+ b .L719
.size update_vpc_list, .-update_vpc_list
.section .text.decrement_vpc_count,"ax",@progbits
.align 2
@@ -5240,50 +5286,50 @@ decrement_vpc_count:
str x21, [sp, 32]
mov w0, 65535
cmp w19, w0
- beq .L706
+ beq .L723
adrp x21, .LANCHOR42
ubfiz x20, x19, 1, 16
ldr x1, [x21, #:lo12:.LANCHOR42]
ldrh w0, [x1, x20]
- cbnz w0, .L707
+ cbnz w0, .L724
mov w2, 0
mov w1, w19
- adrp x0, .LC17
- add x0, x0, :lo12:.LC17
+ adrp x0, .LC21
+ add x0, x0, :lo12:.LC21
bl printf
ldr x0, [x21, #:lo12:.LANCHOR42]
ldrh w0, [x0, x20]
- cbz w0, .L708
-.L713:
+ cbz w0, .L725
+.L730:
mov w20, 0
-.L705:
+.L722:
mov w0, w20
ldr x21, [sp, 32]
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 48
ret
-.L708:
- mov w2, 2841
+.L725:
+ mov w2, 2842
adrp x1, .LANCHOR147
adrp x0, .LC1
add x1, x1, :lo12:.LANCHOR147
add x0, x0, :lo12:.LC1
bl printf
- b .L713
-.L707:
+ b .L730
+.L724:
sub w0, w0, #1
strh w0, [x1, x20]
-.L706:
+.L723:
adrp x21, .LANCHOR131
mov w1, 65535
ldrh w0, [x21, #:lo12:.LANCHOR131]
cmp w0, w1
- bne .L710
+ bne .L727
strh w19, [x21, #:lo12:.LANCHOR131]
- b .L713
-.L710:
+ b .L730
+.L727:
cmp w19, w0
- beq .L713
+ beq .L730
bl update_vpc_list
cmp w0, 0
adrp x1, .LANCHOR40
@@ -5301,16 +5347,16 @@ decrement_vpc_count:
ldr x1, [x1, #:lo12:.LANCHOR42]
and x2, x0, 65535
ldrh w1, [x1, x2, lsl 1]
- cbnz w1, .L705
+ cbnz w1, .L722
cmp w19, w0, uxth
- beq .L705
- mov w2, 2857
+ beq .L722
+ mov w2, 2858
adrp x1, .LANCHOR147
adrp x0, .LC1
add x1, x1, :lo12:.LANCHOR147
add x0, x0, :lo12:.LC1
bl printf
- b .L705
+ b .L722
.size decrement_vpc_count, .-decrement_vpc_count
.section .text.FtlSuperblockPowerLostFix,"ax",@progbits
.align 2
@@ -5347,10 +5393,10 @@ FtlSuperblockPowerLostFix:
mov w1, 22136
movk w1, 0x1234, lsl 16
str w1, [x0, 4]
-.L720:
+.L737:
ldrh w0, [x19, 4]
- cbnz w0, .L716
-.L717:
+ cbnz w0, .L733
+.L734:
ldrh w0, [x19]
adrp x1, .LANCHOR42
ldrh w3, [x19, 4]
@@ -5368,12 +5414,12 @@ FtlSuperblockPowerLostFix:
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 80
ret
-.L716:
+.L733:
mov x0, x19
bl get_new_active_ppa
str w0, [x29, 52]
cmn w0, #1
- beq .L717
+ beq .L734
ldr w0, [x22]
mov w3, 0
str w0, [x21, 4]
@@ -5388,8 +5434,8 @@ FtlSuperblockPowerLostFix:
ldrh w0, [x19]
bl decrement_vpc_count
subs w20, w20, #1
- bne .L720
- b .L717
+ bne .L737
+ b .L734
.size FtlSuperblockPowerLostFix, .-FtlSuperblockPowerLostFix
.section .text.FtlMakeBbt,"ax",@progbits
.align 2
@@ -5415,42 +5461,42 @@ FtlMakeBbt:
adrp x0, .LANCHOR10
add x0, x0, :lo12:.LANCHOR10
str x0, [x29, 120]
-.L729:
+.L746:
ldr x0, [x29, 120]
ldrh w0, [x0]
cmp w22, w0
- bcc .L735
+ bcc .L752
adrp x21, .LANCHOR25
add x21, x21, :lo12:.LANCHOR25
mov w19, 0
-.L736:
+.L753:
ldrh w0, [x21]
cmp w0, w19
- bhi .L737
+ bhi .L754
add x21, x20, :lo12:.LANCHOR37
mov w22, 65535
ldrh w19, [x21, 12]
sub w19, w19, #1
and w19, w19, 65535
-.L738:
+.L755:
ldrh w0, [x21, 12]
sub w0, w0, #47
cmp w0, w19
- bgt .L742
+ bgt .L759
mov w0, w19
bl FtlBbmIsBadBlock
cmp w0, 1
- beq .L739
+ beq .L756
mov w0, w19
bl FlashTestBlk
- cbz w0, .L740
+ cbz w0, .L757
mov w0, w19
bl FtlBbmMapBadBlock
-.L739:
+.L756:
sub w19, w19, #1
and w19, w19, 65535
- b .L738
-.L735:
+ b .L755
+.L752:
adrp x2, .LANCHOR114
adrp x0, .LANCHOR106
add x19, x28, :lo12:.LANCHOR138
@@ -5462,7 +5508,7 @@ FtlMakeBbt:
stp x0, x26, [x19, 8]
adrp x23, .LANCHOR17
str x2, [x29, 112]
- beq .L730
+ beq .L747
ldrh w4, [x23, #:lo12:.LANCHOR17]
mov w2, 1
madd w27, w4, w22, w1
@@ -5477,14 +5523,14 @@ FtlMakeBbt:
add w2, w2, 7
lsr w2, w2, 3
bl ftl_memcpy
-.L731:
+.L748:
mov w0, w27
add w22, w22, 1
bl FtlBbmMapBadBlock
add x24, x24, 8
add x21, x21, 2
- b .L729
-.L730:
+ b .L746
+.L747:
mov w1, w22
bl FlashGetBadBlockList
ldr x0, [x19, 8]
@@ -5497,12 +5543,12 @@ FtlMakeBbt:
add x0, x0, :lo12:.LANCHOR127
and w19, w19, 65535
str x0, [x29, 104]
-.L732:
+.L749:
ldrh w0, [x23]
madd w0, w22, w0, w19
bl FtlBbmIsBadBlock
cmp w0, 1
- beq .L733
+ beq .L750
ldr x0, [x29, 112]
mov w2, 16
strh w19, [x21]
@@ -5540,29 +5586,29 @@ FtlMakeBbt:
bl FlashProgPages
ldr w0, [x25]
cmn w0, #1
- bne .L731
+ bne .L748
mov w0, w27
bl FtlBbmMapBadBlock
- b .L732
-.L733:
+ b .L749
+.L750:
sub w19, w19, #1
and w19, w19, 65535
- b .L732
-.L737:
+ b .L749
+.L754:
mov w0, w19
add w19, w19, 1
bl FtlBbmMapBadBlock
and w19, w19, 65535
- b .L736
-.L740:
+ b .L753
+.L757:
ldrh w0, [x21]
cmp w0, w22
- bne .L741
+ bne .L758
strh w19, [x21]
- b .L739
-.L741:
+ b .L756
+.L758:
strh w19, [x21, 4]
-.L742:
+.L759:
adrp x0, .LANCHOR79
add x19, x20, :lo12:.LANCHOR37
ldrh w1, [x20, #:lo12:.LANCHOR37]
@@ -5617,18 +5663,18 @@ js_hash:
mov w0, 42982
mov x3, 0
movk w0, 0x47c6, lsl 16
-.L750:
+.L767:
cmp w1, w3
- bhi .L751
+ bhi .L768
ret
-.L751:
+.L768:
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 .L750
+ b .L767
.size js_hash, .-js_hash
.section .text.Ftl_write_map_blk_to_last_page,"ax",@progbits
.align 2
@@ -5645,16 +5691,16 @@ Ftl_write_map_blk_to_last_page:
ldrh w0, [x0]
stp x23, x24, [sp, 48]
cmp w0, w1
- bne .L753
+ bne .L770
ldrh w0, [x19, 8]
- cbz w0, .L754
+ cbz w0, .L771
adrp x1, .LANCHOR148
adrp x0, .LC1
mov w2, 641
add x1, x1, :lo12:.LANCHOR148
add x0, x0, :lo12:.LC1
bl printf
-.L754:
+.L771:
ldrh w0, [x19, 8]
add w0, w0, 1
strh w0, [x19, 8]
@@ -5665,14 +5711,14 @@ Ftl_write_map_blk_to_last_page:
add w0, w0, 1
strh wzr, [x19]
str w0, [x19, 48]
-.L755:
+.L772:
mov w0, 0
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
ldp x23, x24, [sp, 48]
ldp x29, x30, [sp], 64
ret
-.L753:
+.L770:
ubfiz x0, x0, 1, 16
adrp x2, .LANCHOR114
adrp x24, .LANCHOR106
@@ -5703,9 +5749,9 @@ Ftl_write_map_blk_to_last_page:
mov x0, 0
ldr x3, [x24, #:lo12:.LANCHOR106]
mov w1, 0
-.L756:
+.L773:
cmp w4, w0, uxth
- bhi .L758
+ bhi .L775
add x20, x20, :lo12:.LANCHOR138
adrp x0, .LANCHOR23
ldrh w1, [x0, #:lo12:.LANCHOR23]
@@ -5722,11 +5768,11 @@ Ftl_write_map_blk_to_last_page:
strh w0, [x19, 2]
mov x0, x19
bl ftl_map_blk_gc
- b .L755
-.L758:
+ b .L772
+.L775:
ldr w2, [x23, x0, lsl 2]
cmp w22, w2, lsr 10
- bne .L757
+ bne .L774
add w1, w1, 1
and w1, w1, 65535
ubfiz x2, x1, 1, 16
@@ -5734,9 +5780,9 @@ Ftl_write_map_blk_to_last_page:
add x2, x2, 1
ldr w5, [x23, x0, lsl 2]
str w5, [x3, x2, lsl 2]
-.L757:
+.L774:
add x0, x0, 1
- b .L756
+ b .L773
.size Ftl_write_map_blk_to_last_page, .-Ftl_write_map_blk_to_last_page
.section .text.FtlMapWritePage,"ax",@progbits
.align 2
@@ -5760,7 +5806,7 @@ FtlMapWritePage:
add x28, x26, :lo12:.LANCHOR20
stp x21, x22, [sp, 32]
mov w22, 0
-.L764:
+.L781:
ldr w0, [x23]
ldrh w1, [x19, 2]
add w0, w0, 1
@@ -5768,35 +5814,35 @@ FtlMapWritePage:
ldrh w0, [x26, #:lo12:.LANCHOR20]
sub w0, w0, #1
cmp w1, w0
- bge .L765
+ bge .L782
ldrh w1, [x19]
mov w0, 65535
cmp w1, w0
- bne .L766
-.L765:
+ bne .L783
+.L782:
mov x0, x19
bl Ftl_write_map_blk_to_last_page
-.L766:
+.L783:
ldrh w1, [x19]
ldr x0, [x19, 16]
ldrh w0, [x0, x1, lsl 1]
- cbnz w0, .L767
+ cbnz w0, .L784
adrp x0, .LC1
mov w2, 700
mov x1, x24
add x0, x0, :lo12:.LC1
bl printf
-.L767:
+.L784:
ldrh w1, [x19]
ldrh w0, [x19, 10]
cmp w1, w0
- bcc .L768
+ bcc .L785
adrp x0, .LC1
mov w2, 701
mov x1, x24
add x0, x0, :lo12:.LC1
bl printf
-.L768:
+.L785:
ldrh w1, [x19]
adrp x21, .LANCHOR138
ldr x0, [x19, 16]
@@ -5837,46 +5883,46 @@ FtlMapWritePage:
and w0, w0, 65535
strh w0, [x19, 2]
cmn w1, #1
- bne .L769
+ bne .L786
ldr w1, [x20, 4]
- adrp x0, .LC18
- add x0, x0, :lo12:.LC18
+ adrp x0, .LC22
+ add x0, x0, :lo12:.LC22
add w22, w22, 1
and w22, w22, 65535
bl printf
ldrh w0, [x19, 2]
cmp w0, 2
- bhi .L770
+ bhi .L787
ldrh w0, [x28]
sub w0, w0, #1
strh w0, [x19, 2]
-.L770:
+.L787:
cmp w22, 3
- bls .L771
+ bls .L788
add x21, x21, :lo12:.LANCHOR138
- adrp x0, .LC19
+ adrp x0, .LC23
mov w2, w22
- add x0, x0, :lo12:.LC19
+ add x0, x0, :lo12:.LC23
ldr w1, [x21, 4]
bl printf
-.L772:
- b .L772
-.L771:
+.L789:
+ b .L789
+.L788:
ldr w0, [x19, 52]
- cbz w0, .L764
+ cbz w0, .L781
+.L803:
+ b .L803
.L786:
- b .L786
-.L769:
cmp w0, 1
- beq .L775
+ beq .L792
cmp w1, 256
- beq .L775
+ beq .L792
ldr w0, [x19, 56]
- cbz w0, .L776
-.L775:
+ cbz w0, .L793
+.L792:
str wzr, [x19, 56]
- b .L764
-.L776:
+ b .L781
+.L793:
ldr x0, [x19, 40]
ldr w1, [x20, 4]
ldp x21, x22, [sp, 32]
@@ -5906,20 +5952,20 @@ load_l2p_region:
stp x25, x26, [sp, 64]
str x27, [sp, 80]
cmp w0, w20
- bcs .L789
+ bcs .L806
adrp x1, .LANCHOR150
adrp x0, .LC1
mov w2, 485
add x1, x1, :lo12:.LANCHOR150
add x0, x0, :lo12:.LC1
bl printf
-.L789:
+.L806:
adrp x27, .LANCHOR124
ubfiz x0, x20, 2, 16
adrp x22, .LANCHOR55
ldr x1, [x27, #:lo12:.LANCHOR124]
ldr w23, [x1, x0]
- cbnz w23, .L790
+ cbnz w23, .L807
ldr x0, [x22, #:lo12:.LANCHOR55]
lsl x19, x19, 4
adrp x1, .LANCHOR23
@@ -5932,7 +5978,7 @@ load_l2p_region:
add x1, x0, x19
strh w20, [x0, x19]
str wzr, [x1, 4]
-.L791:
+.L808:
mov w0, 0
ldr x27, [sp, 80]
ldp x19, x20, [sp, 16]
@@ -5941,7 +5987,7 @@ load_l2p_region:
ldp x25, x26, [sp, 64]
ldp x29, x30, [sp], 96
ret
-.L790:
+.L807:
ldr x0, [x22, #:lo12:.LANCHOR55]
lsl x19, x19, 4
adrp x26, .LANCHOR138
@@ -5960,48 +6006,48 @@ load_l2p_region:
ldr x25, [x21, 16]
ldrh w0, [x25, 8]
cmp w0, w20
- beq .L792
+ beq .L809
mov w2, w23
mov w1, w20
- adrp x0, .LC20
- add x0, x0, :lo12:.LC20
+ adrp x0, .LC24
+ add x0, x0, :lo12:.LC24
bl printf
ldr x1, [x21, 16]
mov w3, 4
- adrp x0, .LC21
+ adrp x0, .LC13
mov w2, w3
- add x0, x0, :lo12:.LC21
+ add x0, x0, :lo12:.LC13
bl rknand_print_hex
ldrh w3, [x24, #:lo12:.LANCHOR32]
- adrp x0, .LC22
+ adrp x0, .LC25
ldr x1, [x27, #:lo12:.LANCHOR124]
mov w2, 4
- add x0, x0, :lo12:.LC22
+ add x0, x0, :lo12:.LC25
bl rknand_print_hex
-.L793:
+.L810:
ldrh w0, [x25, 8]
cmp w0, w20
- beq .L794
+ beq .L811
adrp x1, .LANCHOR150
adrp x0, .LC1
mov w2, 508
add x1, x1, :lo12:.LANCHOR150
add x0, x0, :lo12:.LC1
bl printf
-.L794:
+.L811:
ldr x0, [x22, #:lo12:.LANCHOR55]
add x1, x0, x19
str wzr, [x1, 4]
strh w20, [x0, x19]
- b .L791
-.L792:
+ b .L808
+.L809:
ldr w0, [x26, #:lo12:.LANCHOR138]
cmp w0, 256
- bne .L793
+ bne .L810
mov w2, w23
mov w1, w20
- adrp x0, .LC23
- add x0, x0, :lo12:.LC23
+ adrp x0, .LC26
+ add x0, x0, :lo12:.LC26
bl printf
ldr x0, [x22, #:lo12:.LANCHOR55]
mov w1, w20
@@ -6010,7 +6056,7 @@ load_l2p_region:
adrp x0, .LANCHOR129
add x0, x0, :lo12:.LANCHOR129
bl FtlMapWritePage
- b .L793
+ b .L810
.size load_l2p_region, .-load_l2p_region
.section .text.ftl_map_blk_gc,"ax",@progbits
.align 2
@@ -6033,12 +6079,12 @@ ftl_map_blk_gc:
ldrh w2, [x19, 8]
sub w1, w1, #5
cmp w2, w1
- blt .L797
+ blt .L814
ubfiz x0, x0, 1, 16
ldrh w22, [x20, x0]
- cbz w22, .L797
+ cbz w22, .L814
ldr w1, [x19, 52]
- cbnz w1, .L797
+ cbnz w1, .L814
mov w1, 1
str w1, [x19, 52]
strh wzr, [x20, x0]
@@ -6048,31 +6094,31 @@ ftl_map_blk_gc:
strh w0, [x19, 8]
ldrh w0, [x24, #:lo12:.LANCHOR20]
cmp w1, w0
- bcc .L798
+ bcc .L815
mov x0, x19
bl ftl_map_blk_alloc_new_blk
-.L798:
+.L815:
adrp x26, .LANCHOR138
adrp x23, .LANCHOR151
add x27, x26, :lo12:.LANCHOR138
add x23, x23, :lo12:.LANCHOR151
mov w20, 0
-.L799:
+.L816:
ldrh w0, [x19, 6]
cmp w0, w20
- bhi .L806
+ bhi .L823
mov w1, 1
mov w0, w22
bl FtlFreeSysBlkQueueIn
str wzr, [x19, 52]
-.L797:
+.L814:
ldrh w1, [x19, 2]
ldrh w0, [x24, #:lo12:.LANCHOR20]
cmp w1, w0
- bcc .L807
+ bcc .L824
mov x0, x19
bl ftl_map_blk_alloc_new_blk
-.L807:
+.L824:
mov w0, 0
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
@@ -6081,12 +6127,12 @@ ftl_map_blk_gc:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 96
ret
-.L806:
+.L823:
ubfiz x0, x20, 2, 16
add x28, x25, x0
ldr w1, [x25, x0]
cmp w22, w1, lsr 10
- bne .L800
+ bne .L817
adrp x2, .LANCHOR107
add x0, x26, :lo12:.LANCHOR138
ldr x2, [x2, #:lo12:.LANCHOR107]
@@ -6100,36 +6146,36 @@ ftl_map_blk_gc:
bl FlashReadPages
ldrh w0, [x21, 8]
cmp w0, w20
- beq .L801
+ beq .L818
adrp x0, .LC1
mov w2, 611
mov x1, x23
add x0, x0, :lo12:.LC1
bl printf
-.L801:
+.L818:
ldr w0, [x27]
cmn w0, #1
- bne .L802
-.L804:
+ bne .L819
+.L821:
str wzr, [x28]
-.L803:
- b .L803
-.L802:
+.L820:
+ b .L820
+.L819:
ldrh w0, [x21, 8]
cmp w0, w20
- bne .L804
+ bne .L821
ldrh w1, [x21]
ldrh w0, [x19, 4]
cmp w1, w0
- bne .L804
+ bne .L821
ldr x2, [x27, 8]
mov w1, w20
mov x0, x19
bl FtlMapWritePage
-.L800:
+.L817:
add w20, w20, 1
and w20, w20, 65535
- b .L799
+ b .L816
.size ftl_map_blk_gc, .-ftl_map_blk_gc
.section .text.flush_l2p_region,"ax",@progbits
.align 2
@@ -6171,27 +6217,27 @@ l2p_flush:
str x21, [sp, 32]
mov w19, 0
adrp x21, .LANCHOR55
-.L816:
+.L833:
ldrh w0, [x20]
cmp w0, w19
- bhi .L818
+ bhi .L835
mov w0, 0
ldr x21, [sp, 32]
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 48
ret
-.L818:
+.L835:
ldr x1, [x21, #:lo12:.LANCHOR55]
ubfiz x0, x19, 4, 16
add x0, x1, x0
ldr w0, [x0, 4]
- tbz w0, #31, .L817
+ tbz w0, #31, .L834
mov w0, w19
bl flush_l2p_region
-.L817:
+.L834:
add w19, w19, 1
and w19, w19, 65535
- b .L816
+ b .L833
.size l2p_flush, .-l2p_flush
.section .text.log2phys,"ax",@progbits
.align 2
@@ -6213,17 +6259,17 @@ log2phys:
ldr w1, [x0, #:lo12:.LANCHOR152]
mov w21, w2
cmp w25, w1
- bcc .L821
+ bcc .L838
adrp x1, .LANCHOR153
adrp x0, .LC1
mov w2, 813
add x1, x1, :lo12:.LANCHOR153
add x0, x0, :lo12:.LC1
bl printf
-.L821:
+.L838:
ldr w0, [x19, #:lo12:.LANCHOR152]
cmp w25, w0
- bcs .L822
+ bcs .L839
adrp x23, .LANCHOR55
add w24, w24, 7
adrp x0, .LANCHOR33
@@ -6232,10 +6278,10 @@ log2phys:
and w22, w22, 65535
ldrh w1, [x0, #:lo12:.LANCHOR33]
mov x0, 0
-.L823:
+.L840:
and x19, x0, 65535
cmp w19, w1
- bcc .L828
+ bcc .L845
bl select_l2p_ram_region
and x19, x0, 65535
ldr x2, [x23, #:lo12:.LANCHOR55]
@@ -6245,33 +6291,33 @@ log2phys:
ldrh w2, [x2, x1]
mov w1, 65535
cmp w2, w1
- beq .L829
+ beq .L846
ldr w1, [x3, 4]
- tbz w1, #31, .L829
+ tbz w1, #31, .L846
bl flush_l2p_region
-.L829:
+.L846:
mov w1, w26
mov w0, w22
bl load_l2p_region
- b .L825
-.L822:
+ b .L842
+.L839:
mov w0, -1
- cbnz w21, .L820
+ cbnz w21, .L837
str w0, [x20]
-.L820:
+.L837:
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
-.L828:
+.L845:
add x0, x0, 1
add x3, x2, x0, lsl 4
ldrh w3, [x3, -16]
cmp w3, w22
- bne .L823
-.L825:
+ bne .L840
+.L842:
mov x0, 1
ldr x1, [x23, #:lo12:.LANCHOR55]
lsl x0, x0, x24
@@ -6279,22 +6325,22 @@ log2phys:
and w0, w0, w25
and x0, x0, 65535
add x1, x1, x19, lsl 4
- cbnz w21, .L826
+ cbnz w21, .L843
ldr x1, [x1, 8]
ldr w0, [x1, x0, lsl 2]
str w0, [x20]
-.L827:
+.L844:
ldr x0, [x23, #:lo12:.LANCHOR55]
add x19, x0, x19, lsl 4
ldr w0, [x19, 4]
cmn w0, #1
- beq .L831
+ beq .L848
add w0, w0, 1
str w0, [x19, 4]
-.L831:
+.L848:
mov w0, 0
- b .L820
-.L826:
+ b .L837
+.L843:
ldr x2, [x1, 8]
ldr w3, [x20]
str w3, [x2, x0, lsl 2]
@@ -6303,7 +6349,7 @@ log2phys:
str w0, [x1, 4]
adrp x0, .LANCHOR56
strh w22, [x0, #:lo12:.LANCHOR56]
- b .L827
+ b .L844
.size log2phys, .-log2phys
.section .text.FtlReUsePrevPpa,"ax",@progbits
.align 2
@@ -6324,10 +6370,10 @@ FtlReUsePrevPpa:
and w3, w0, 65535
ubfiz x20, x3, 1, 16
ldrh w1, [x2, x20]
- cbnz w1, .L835
- adrp x0, .LANCHOR47
- ldr x19, [x0, #:lo12:.LANCHOR47]
- cbz x19, .L836
+ cbnz w1, .L852
+ adrp x0, .LANCHOR46
+ ldr x19, [x0, #:lo12:.LANCHOR46]
+ cbz x19, .L853
adrp x2, .LANCHOR40
mov x5, -6148914691236517206
movk x5, 0xaaab, lsl 0
@@ -6340,23 +6386,23 @@ FtlReUsePrevPpa:
mul x19, x19, x5
mov w5, 6
and w19, w19, 65535
-.L837:
+.L854:
cmp w1, w4
- beq .L836
+ beq .L853
cmp w19, w3
- bne .L838
+ bne .L855
mov w1, w19
- add x0, x0, :lo12:.LANCHOR47
+ add x0, x0, :lo12:.LANCHOR46
bl List_remove_node
ldrh w0, [x23, #:lo12:.LANCHOR48]
- cbnz w0, .L839
+ cbnz w0, .L856
adrp x1, .LANCHOR154
adrp x0, .LC1
mov w2, 1733
add x1, x1, :lo12:.LANCHOR154
add x0, x0, :lo12:.LC1
bl printf
-.L839:
+.L856:
ldrh w0, [x23, #:lo12:.LANCHOR48]
sub w0, w0, #1
strh w0, [x23, #:lo12:.LANCHOR48]
@@ -6366,7 +6412,7 @@ FtlReUsePrevPpa:
ldrh w0, [x1, x20]
add w0, w0, 1
strh w0, [x1, x20]
-.L836:
+.L853:
add x1, x29, 76
mov w2, 1
mov w0, w21
@@ -6376,18 +6422,18 @@ FtlReUsePrevPpa:
ldr x23, [sp, 48]
ldp x29, x30, [sp], 80
ret
-.L838:
+.L855:
umull x19, w19, w5
ldrh w19, [x2, x19]
cmp w19, w6
- beq .L836
+ beq .L853
add w1, w1, 1
and w1, w1, 65535
- b .L837
-.L835:
+ b .L854
+.L852:
add w1, w1, 1
strh w1, [x2, x20]
- b .L836
+ b .L853
.size FtlReUsePrevPpa, .-FtlReUsePrevPpa
.section .text.FtlRecoverySuperblock,"ax",@progbits
.align 2
@@ -6405,7 +6451,7 @@ FtlRecoverySuperblock:
stp x25, x26, [sp, 64]
cmp w0, w1
stp x27, x28, [sp, 80]
- beq .L968
+ beq .L989
ldrb w0, [x19, 6]
str w0, [x29, 164]
adrp x0, .LANCHOR19
@@ -6413,11 +6459,11 @@ FtlRecoverySuperblock:
str x0, [x29, 128]
ldrh w2, [x0, #:lo12:.LANCHOR19]
cmp w2, w26
- bne .L848
+ bne .L865
strh wzr, [x19, 4]
-.L976:
+.L996:
strb wzr, [x19, 6]
-.L968:
+.L989:
ldp x19, x20, [sp, 16]
mov w0, 0
ldp x21, x22, [sp, 32]
@@ -6426,17 +6472,17 @@ FtlRecoverySuperblock:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 192
ret
-.L848:
+.L865:
ldrh w0, [x19, 16]
mov w20, 0
-.L849:
+.L866:
cmp w0, w1
- beq .L850
+ beq .L867
mov w1, 1
bl FtlGetLastWrittenPage
mov w23, w0
cmn w0, #1
- beq .L851
+ beq .L868
adrp x1, .LANCHOR64
adrp x2, .LANCHOR3
adrp x20, .LANCHOR103
@@ -6457,9 +6503,9 @@ FtlRecoverySuperblock:
ldrh w1, [x2, #:lo12:.LANCHOR3]
add x1, x1, 8
add x1, x19, x1, lsl 1
-.L852:
+.L869:
cmp x4, x1
- bne .L856
+ bne .L873
mov w2, 0
mov w1, w22
bl FlashReadPages
@@ -6473,69 +6519,69 @@ FtlRecoverySuperblock:
mov w3, 0
sub w21, w21, #1
str x0, [x29, 144]
-.L857:
+.L874:
cmp w22, w3
- bne .L862
+ bne .L879
add w22, w23, 1
ldr w0, [x4, 4]
and w22, w22, 65535
-.L970:
+.L991:
lsr w0, w0, 10
bl P2V_plane
and w27, w0, 65535
ldr x0, [x29, 128]
ldrh w0, [x0, #:lo12:.LANCHOR19]
cmp w0, w22
- bne .L864
+ bne .L881
strh w22, [x19, 2]
strb wzr, [x19, 6]
strh wzr, [x19, 4]
-.L864:
+.L881:
ldr w0, [x29, 164]
cmp w22, w26
cset w1, eq
cmp w27, w0
cset w0, eq
tst w1, w0
- beq .L865
-.L977:
+ beq .L882
+.L997:
mov w2, w27
mov w1, w22
mov x0, x19
bl ftl_sb_update_avl_pages
- b .L968
-.L850:
+ b .L989
+.L867:
add w20, w20, 1
and w20, w20, 65535
add x0, x19, x20, sxtw 1
ldrh w0, [x0, 16]
- b .L849
-.L851:
- cbz w26, .L853
+ b .L866
+.L868:
+ cbz w26, .L870
adrp x1, .LANCHOR155
adrp x0, .LC1
mov w2, 1800
add x1, x1, :lo12:.LANCHOR155
add x0, x0, :lo12:.LC1
bl printf
-.L853:
+.L870:
ldr w0, [x29, 164]
cmp w0, 0
ccmp w20, w0, 4, ne
- beq .L854
+ beq .L871
adrp x1, .LANCHOR155
adrp x0, .LC1
mov w2, 1801
add x1, x1, :lo12:.LANCHOR155
add x0, x0, :lo12:.LC1
bl printf
-.L854:
+.L871:
strh wzr, [x19, 2]
- b .L976
-.L856:
+ b .L996
+.L873:
ldrh w3, [x4]
cmp w3, w10
- beq .L855
+ beq .L872
ubfiz x2, x22, 5, 16
orr w3, w23, w3, lsl 10
add x2, x0, x2
@@ -6550,90 +6596,90 @@ FtlRecoverySuperblock:
asr w3, w3, 2
add x3, x7, x3, sxtw 2
str x3, [x2, 16]
-.L855:
+.L872:
add x4, x4, 2
- b .L852
-.L862:
+ b .L869
+.L879:
ldr w0, [x11]
- cbnz w0, .L858
+ cbnz w0, .L875
ldr x8, [x11, 16]
ldr w5, [x8, 4]
cmn w5, #1
- beq .L859
+ beq .L876
ldr w1, [x7]
mov w0, w5
bl ftl_cmp_data_ver
- cbz w0, .L859
+ cbz w0, .L876
add w5, w5, 1
str w5, [x7]
-.L859:
+.L876:
ldr w0, [x8]
cmn w0, #1
- bne .L861
+ bne .L878
ubfiz x3, x3, 5, 16
and w22, w23, 65535
add x3, x4, x3
ldr w0, [x3, 4]
- b .L970
-.L858:
+ b .L991
+.L875:
mov w6, w10
-.L861:
+.L878:
add w3, w3, 1
add x11, x11, 32
and w3, w3, 65535
- b .L857
-.L865:
+ b .L874
+.L882:
mov w0, 65535
cmp w6, w0
- bne .L866
+ bne .L883
ldrb w0, [x19, 8]
- cbnz w0, .L867
-.L866:
+ cbnz w0, .L884
+.L883:
adrp x25, .LANCHOR134
and w28, w23, 65535
ldr w0, [x25, #:lo12:.LANCHOR134]
cmn w0, #1
- bne .L868
+ bne .L885
str w21, [x25, #:lo12:.LANCHOR134]
-.L868:
+.L885:
add w0, w26, 7
cmp w0, w23, uxth
- bge .L920
+ bge .L935
sub w24, w28, #7
and w24, w24, 65535
-.L869:
+.L886:
ldr x0, [x29, 152]
mov w3, 65535
mov w5, 1
add x4, x0, :lo12:.LANCHOR3
-.L870:
+.L887:
cmp w24, w28
- bhi .L880
+ bhi .L897
ldrh w1, [x4]
mov w23, 0
ldr x0, [x20, #:lo12:.LANCHOR103]
add x1, x1, 8
ldr x2, [x29, 168]
add x1, x19, x1, lsl 1
- b .L881
-.L920:
+ b .L898
+.L935:
mov w24, w26
- b .L869
-.L872:
+ b .L886
+.L889:
ldrh w6, [x2]
cmp w6, w3
- beq .L871
+ beq .L888
ubfiz x7, x23, 5, 16
add w23, w23, 1
add x7, x0, x7
and w23, w23, 65535
orr w6, w24, w6, lsl 10
str w6, [x7, 4]
-.L871:
+.L888:
add x2, x2, 2
-.L881:
+.L898:
cmp x1, x2
- bne .L872
+ bne .L889
mov w1, w23
mov w2, 0
str w5, [x29, 112]
@@ -6650,105 +6696,105 @@ FtlRecoverySuperblock:
add x23, x2, x23
ldr x4, [x29, 136]
mov w2, 0
-.L873:
+.L890:
cmp x23, x0
- bne .L878
- cbz w2, .L879
+ bne .L895
+ cbz w2, .L896
str w1, [x25, #:lo12:.LANCHOR134]
-.L879:
+.L896:
add w24, w24, 1
and w24, w24, 65535
- b .L870
-.L878:
+ b .L887
+.L895:
ldr w6, [x0, -16]
- cbz w6, .L874
- cbz w2, .L867
+ cbz w6, .L891
+ cbz w2, .L884
str w1, [x25, #:lo12:.LANCHOR134]
-.L867:
+.L884:
adrp x0, .LANCHOR156
- mov w24, w26
+ mov w23, w26
mov w1, 1
adrp x28, .LANCHOR134
strh w1, [x0, #:lo12:.LANCHOR156]
add x0, x28, :lo12:.LANCHOR134
str x0, [x29, 104]
-.L882:
+.L899:
ldr x1, [x29, 152]
- mov w23, 0
+ mov w24, 0
ldr x0, [x20, #:lo12:.LANCHOR103]
mov w5, 65535
ldr x2, [x29, 168]
ldrh w1, [x1, #:lo12:.LANCHOR3]
add x1, x1, 8
add x1, x19, x1, lsl 1
-.L883:
+.L900:
cmp x1, x2
- bne .L885
+ bne .L902
mov w2, 0
- mov w1, w23
+ mov w1, w24
bl FlashReadPages
mov x25, 0
- ubfiz x0, x23, 5, 16
+ ubfiz x0, x24, 5, 16
str x0, [x29, 112]
adrp x0, .LANCHOR157
add x0, x0, :lo12:.LANCHOR157
str x0, [x29, 120]
-.L886:
+.L903:
ldr x0, [x29, 112]
- cmp x0, x25
- bne .L914
+ cmp x25, x0
+ bne .L929
ldr x0, [x29, 128]
- add w24, w24, 1
- and w24, w24, 65535
+ add w23, w23, 1
+ and w23, w23, 65535
ldrh w0, [x0, #:lo12:.LANCHOR19]
- cmp w0, w24
- bne .L882
+ cmp w0, w23
+ bne .L899
ldr x0, [x29, 152]
mov w2, 65535
- strh w24, [x19, 2]
+ strh w23, [x19, 2]
strh wzr, [x19, 4]
ldrh w1, [x0, #:lo12:.LANCHOR3]
mov w0, 0
-.L915:
+.L930:
cmp w0, w1
- beq .L968
+ beq .L989
ldr x4, [x29, 168]
ldrh w3, [x4], 2
str x4, [x29, 168]
cmp w3, w2
- beq .L916
+ beq .L931
strb w0, [x19, 6]
- b .L968
-.L874:
+ b .L989
+.L891:
ldr x6, [x0]
ldrh w7, [x6]
cmp w7, w3
- beq .L877
+ beq .L894
ldr w6, [x6, 4]
cmn w6, #1
csel w1, w1, w6, eq
csel w2, w2, w5, eq
-.L877:
+.L894:
add x0, x0, 32
- b .L873
-.L880:
+ b .L890
+.L897:
mov w0, -1
str w0, [x25, #:lo12:.LANCHOR134]
- b .L867
-.L885:
+ b .L884
+.L902:
ldrh w3, [x2]
cmp w3, w5
- beq .L884
- ubfiz x4, x23, 5, 16
- add w23, w23, 1
+ beq .L901
+ ubfiz x4, x24, 5, 16
+ add w24, w24, 1
add x4, x0, x4
- and w23, w23, 65535
- orr w3, w24, w3, lsl 10
+ and w24, w24, 65535
+ orr w3, w23, w3, lsl 10
str w3, [x4, 4]
-.L884:
+.L901:
add x2, x2, 2
- b .L883
-.L914:
+ b .L900
+.L929:
ldr x4, [x20, #:lo12:.LANCHOR103]
add x4, x4, x25
ldr w5, [x4, 4]
@@ -6756,54 +6802,54 @@ FtlRecoverySuperblock:
lsr w0, w5, 10
bl P2V_plane
and w0, w0, 65535
- cmp w24, w26
- bcc .L887
+ cmp w23, w26
+ bcc .L904
ldr w1, [x29, 164]
ccmp w1, w0, 0, eq
- bhi .L887
- cmp w24, w22
+ bhi .L904
+ cmp w23, w22
ccmp w27, w0, 0, eq
- beq .L888
+ beq .L905
ldr w0, [x4]
cmn w0, #1
- beq .L889
+ beq .L906
ldr x3, [x4, 16]
mov w0, 61589
ldrh w1, [x3]
cmp w1, w0
- beq .L890
+ beq .L907
ldrh w0, [x19]
-.L974:
+.L993:
bl decrement_vpc_count
- b .L887
-.L890:
+ b .L904
+.L907:
ldr w21, [x3, 4]
cmn w21, #1
- beq .L891
+ beq .L908
ldr x0, [x29, 144]
ldr w1, [x0, #:lo12:.LANCHOR83]
mov w0, w21
bl ftl_cmp_data_ver
- cbz w0, .L891
+ cbz w0, .L908
ldr x1, [x29, 144]
add w0, w21, 1
str w0, [x1, #:lo12:.LANCHOR83]
-.L891:
- ldp w23, w0, [x3, 8]
+.L908:
+ ldp w24, w0, [x3, 8]
add x1, x29, 184
str w0, [x29, 180]
mov w2, 0
- mov w0, w23
+ mov w0, w24
bl log2phys
ldr w1, [x28, #:lo12:.LANCHOR134]
ldr w3, [x29, 180]
cmn w1, #1
- beq .L892
+ beq .L909
mov w0, w21
bl ftl_cmp_data_ver
- cbz w0, .L892
+ cbz w0, .L909
cmn w3, #1
- beq .L893
+ beq .L910
ldr x0, [x20, #:lo12:.LANCHOR103]
mov w2, 0
mov w1, 1
@@ -6817,75 +6863,75 @@ FtlRecoverySuperblock:
add x3, x0, x25
ldr w0, [x0, x25]
cmn w0, #1
- bne .L894
-.L895:
+ bne .L911
+.L912:
mov w0, -1
str w0, [x29, 180]
-.L902:
+.L919:
ldr w3, [x29, 180]
cmn w3, #1
- beq .L887
-.L919:
+ beq .L904
+.L934:
lsr w0, w3, 10
bl P2V_block_in_plane
- and w23, w0, 65535
+ and w24, w0, 65535
adrp x0, .LANCHOR5
- mov w3, w23
+ mov w3, w24
ldrh w0, [x0, #:lo12:.LANCHOR5]
- cmp w0, w23
- bhi .L910
- mov w2, 2065
+ cmp w0, w24
+ bhi .L925
+ mov w2, 2057
adrp x1, .LANCHOR155
adrp x0, .LC1
add x1, x1, :lo12:.LANCHOR155
add x0, x0, :lo12:.LC1
- str w23, [x29, 136]
+ str w24, [x29, 136]
bl printf
ldr w3, [x29, 136]
-.L910:
+.L925:
adrp x1, .LANCHOR42
- ubfiz x0, x23, 1, 16
+ ubfiz x0, x24, 1, 16
ldr x1, [x1, #:lo12:.LANCHOR42]
ldrh w0, [x1, x0]
- cbz w0, .L911
+ cbz w0, .L926
mov w0, w3
- b .L974
-.L893:
+ b .L993
+.L910:
ldp w1, w0, [x29, 184]
cmp w1, w0
- bne .L887
+ bne .L904
mov w2, 1
add x1, x29, 180
- mov w0, w23
+ mov w0, w24
bl log2phys
-.L887:
+.L904:
add x25, x25, 32
- b .L886
-.L894:
+ b .L903
+.L911:
ldr w0, [x4, 8]
- cmp w23, w0
- bne .L895
+ cmp w24, w0
+ bne .L912
ldr w0, [x4, 4]
str w0, [x29, 136]
str x4, [x29, 96]
uxtw x1, w0
ldr w0, [x28, #:lo12:.LANCHOR134]
bl ftl_cmp_data_ver
- cbz w0, .L895
+ cbz w0, .L912
ldp w0, w1, [x29, 184]
ldr x4, [x29, 96]
cmp w0, w1
ldr w1, [x29, 180]
- bne .L897
-.L971:
- mov w0, w23
+ bne .L914
+.L992:
+ mov w0, w24
bl FtlReUsePrevPpa
- b .L895
-.L897:
+ b .L912
+.L914:
cmp w0, w1
- beq .L895
+ beq .L912
cmn w0, #1
- beq .L898
+ beq .L915
ldr x4, [x3, 16]
mov w2, 0
str w0, [x3, 4]
@@ -6894,64 +6940,70 @@ FtlRecoverySuperblock:
mov x0, x3
bl FlashReadPages
ldr x4, [x29, 96]
-.L899:
+.L916:
ldr x0, [x20, #:lo12:.LANCHOR103]
ldr w0, [x0, x25]
cmn w0, #1
- beq .L900
+ beq .L917
ldr x0, [x29, 104]
ldr w3, [x4, 4]
mov w1, w3
ldr w0, [x0]
bl ftl_cmp_data_ver
- cbz w0, .L900
+ cbz w0, .L917
ldr w0, [x29, 136]
mov w1, w3
bl ftl_cmp_data_ver
- cbz w0, .L895
-.L900:
+ cbz w0, .L912
+.L917:
ldr w1, [x29, 180]
- b .L971
-.L898:
+ b .L992
+.L915:
str w0, [x3]
- b .L899
-.L892:
+ b .L916
+.L909:
ldp w1, w0, [x29, 184]
cmp w1, w0
- beq .L902
+ beq .L919
+ cmn w3, #1
+ beq .L921
adrp x0, .LANCHOR8
ldr w0, [x0, #:lo12:.LANCHOR8]
cmp w0, w3, lsr 10
- bhi .L904
- cmn w3, #1
-.L973:
- bne .L887
+ bhi .L921
+ adrp x0, .LC27
+ mov w1, w3
+ add x0, x0, :lo12:.LC27
+.L995:
+ bl printf
+ b .L904
+.L921:
mov w2, 1
add x1, x29, 188
- mov w0, w23
+ mov w0, w24
bl log2phys
ldr w3, [x29, 184]
cmn w3, #1
- beq .L902
+ beq .L919
ldr w0, [x29, 180]
cmp w3, w0
- beq .L919
+ beq .L934
lsr w0, w3, 10
bl P2V_block_in_plane
adrp x1, .LANCHOR51
and w0, w0, 65535
ldrh w1, [x1, #:lo12:.LANCHOR51]
cmp w1, w0
- beq .L909
+ beq .L924
adrp x1, .LANCHOR52
ldrh w1, [x1, #:lo12:.LANCHOR52]
cmp w1, w0
- beq .L909
+ beq .L924
adrp x1, .LANCHOR53
ldrh w1, [x1, #:lo12:.LANCHOR53]
cmp w1, w0
- bne .L902
-.L909:
+ bne .L919
+.L924:
ldr x0, [x20, #:lo12:.LANCHOR103]
mov w2, 0
mov w1, 1
@@ -6962,71 +7014,54 @@ FtlRecoverySuperblock:
ldr x0, [x20, #:lo12:.LANCHOR103]
ldr w0, [x0]
cmn w0, #1
- beq .L902
+ beq .L919
ldr x4, [x29, 136]
mov w0, w21
ldr w1, [x4, 4]
bl ftl_cmp_data_ver
- cbnz w0, .L902
+ cbnz w0, .L919
mov w2, 1
add x1, x29, 184
- mov w0, w23
+ mov w0, w24
bl log2phys
- b .L902
-.L904:
- ldr x0, [x20, #:lo12:.LANCHOR103]
- mov w2, 0
- mov w1, 1
- ldr x4, [x0, 16]
- str w3, [x0, 4]
- str x4, [x29, 136]
- bl FlashReadPages
- ldr x4, [x29, 136]
- ldr w0, [x4, 8]
- cmp w23, w0
- bne .L887
- ldrh w1, [x4]
- mov w0, 61589
- cmp w1, w0
- b .L973
-.L911:
- mov w1, w23
- adrp x0, .LC24
- add x0, x0, :lo12:.LC24
- bl printf
- b .L887
-.L889:
+ b .L919
+.L926:
+ adrp x0, .LC28
+ mov w1, w24
+ add x0, x0, :lo12:.LC28
+ b .L995
+.L906:
ldr x0, [x29, 120]
ldr w0, [x0]
cmp w0, 31
- bhi .L912
+ bhi .L927
adrp x1, .LANCHOR158
add x1, x1, :lo12:.LANCHOR158
str w5, [x1, w0, uxtw 2]
add w0, w0, 1
ldr x1, [x29, 120]
str w0, [x1]
-.L912:
+.L927:
ldrh w0, [x19]
bl decrement_vpc_count
ldr w0, [x28, #:lo12:.LANCHOR134]
cmn w0, #1
- bne .L913
-.L975:
+ bne .L928
+.L994:
str w21, [x28, #:lo12:.LANCHOR134]
- b .L887
-.L913:
+ b .L904
+.L928:
cmp w21, w0
- bcs .L887
- b .L975
-.L916:
+ bcs .L904
+ b .L994
+.L931:
add w0, w0, 1
and w0, w0, 65535
- b .L915
-.L888:
+ b .L930
+.L905:
strb w27, [x19, 6]
strh w22, [x19, 2]
- b .L977
+ b .L997
.size FtlRecoverySuperblock, .-FtlRecoverySuperblock
.section .text.ftl_check_vpc,"ax",@progbits
.align 2
@@ -7034,8 +7069,8 @@ FtlRecoverySuperblock:
.type ftl_check_vpc, %function
ftl_check_vpc:
stp x29, x30, [sp, -112]!
- adrp x0, .LC25
- add x0, x0, :lo12:.LC25
+ adrp x0, .LC29
+ add x0, x0, :lo12:.LC29
add x29, sp, 0
stp x23, x24, [sp, 48]
adrp x23, .LANCHOR152
@@ -7054,29 +7089,29 @@ ftl_check_vpc:
mov w1, 0
mov x0, x19
bl ftl_memset
-.L979:
+.L999:
ldr w0, [x23]
cmp w22, w0
- bcc .L981
+ bcc .L1001
adrp x22, .LANCHOR5
- adrp x24, .LC26
+ adrp x24, .LC30
add x22, x22, :lo12:.LANCHOR5
add x26, x20, :lo12:check_vpc_table
- add x24, x24, :lo12:.LC26
+ add x24, x24, :lo12:.LC30
mov w23, 0
mov w19, 0
adrp x25, .LANCHOR42
-.L982:
+.L1002:
ldrh w0, [x22]
cmp w0, w19
- bhi .L984
- adrp x0, .LANCHOR47
- ldr x19, [x0, #:lo12:.LANCHOR47]
- cbz x19, .L985
+ bhi .L1004
+ adrp x0, .LANCHOR46
+ ldr x19, [x0, #:lo12:.LANCHOR46]
+ cbz x19, .L1005
adrp x0, .LANCHOR48
- adrp x25, .LC27
+ adrp x25, .LC31
add x20, x20, :lo12:check_vpc_table
- add x25, x25, :lo12:.LC27
+ add x25, x25, :lo12:.LC31
ldrh w26, [x0, #:lo12:.LANCHOR48]
adrp x0, .LANCHOR40
mov x24, x0
@@ -7090,17 +7125,17 @@ ftl_check_vpc:
movk x1, 0xaaab, lsl 0
mul x19, x19, x1
and w19, w19, 65535
-.L986:
+.L1006:
cmp w22, w26
- bne .L988
-.L985:
- cbz w23, .L978
+ bne .L1008
+.L1005:
+ cbz w23, .L998
adrp x0, .LC1
- mov w2, 2389
+ mov w2, 2383
add x1, x21, :lo12:.LANCHOR159
add x0, x0, :lo12:.LC1
bl printf
-.L978:
+.L998:
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
ldp x23, x24, [sp, 48]
@@ -7108,31 +7143,31 @@ ftl_check_vpc:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 112
ret
-.L981:
+.L1001:
mov w2, 0
add x1, x29, 108
mov w0, w22
bl log2phys
ldr w0, [x29, 108]
cmn w0, #1
- beq .L980
+ beq .L1000
lsr w0, w0, 10
bl P2V_block_in_plane
and x0, x0, 65535
ldrh w1, [x19, x0, lsl 1]
add w1, w1, 1
strh w1, [x19, x0, lsl 1]
-.L980:
+.L1000:
add w22, w22, 1
- b .L979
-.L984:
+ b .L999
+.L1004:
ldr x0, [x25, #:lo12:.LANCHOR42]
ubfiz x28, x19, 1, 16
sxtw x27, w19
ldrh w2, [x0, x28]
ldrh w3, [x26, x27, lsl 1]
cmp w2, w3
- beq .L983
+ beq .L1003
mov w1, w19
mov x0, x24
bl printf
@@ -7140,34 +7175,34 @@ ftl_check_vpc:
mov w1, 65535
ldrh w0, [x0, x28]
cmp w0, w1
- beq .L983
+ beq .L1003
ldrh w1, [x26, x27, lsl 1]
cmp w1, w0
csinc w23, w23, wzr, ls
-.L983:
+.L1003:
add w19, w19, 1
and w19, w19, 65535
- b .L982
-.L988:
+ b .L1002
+.L1008:
ldr x1, [x27, #:lo12:.LANCHOR42]
ubfiz x0, x19, 1, 16
ldrh w2, [x1, x0]
- cbz w2, .L987
+ cbz w2, .L1007
ldrh w3, [x20, w19, sxtw 1]
mov w23, 1
mov w1, w19
mov x0, x25
bl printf
-.L987:
+.L1007:
ldr x0, [x24, #:lo12:.LANCHOR40]
umull x19, w19, w28
ldrh w19, [x0, x19]
mov w0, 65535
cmp w19, w0
- beq .L985
+ beq .L1005
add w22, w22, 1
and w22, w22, 65535
- b .L986
+ b .L1006
.size ftl_check_vpc, .-ftl_check_vpc
.section .text.ftl_scan_all_data,"ax",@progbits
.align 2
@@ -7175,9 +7210,9 @@ ftl_check_vpc:
.type ftl_scan_all_data, %function
ftl_scan_all_data:
sub sp, sp, #96
- adrp x0, .LC28
+ adrp x0, .LC32
mov w1, 0
- add x0, x0, :lo12:.LC28
+ add x0, x0, :lo12:.LC32
stp x29, x30, [sp, 16]
add x29, sp, 16
stp x19, x20, [sp, 32]
@@ -7189,32 +7224,32 @@ ftl_scan_all_data:
add x21, x21, :lo12:.LANCHOR152
str x23, [sp, 64]
bl printf
-.L1004:
+.L1024:
ldr w0, [x21]
cmp w19, w0
- bcc .L1010
+ bcc .L1030
ldp x19, x20, [sp, 32]
ldp x21, x22, [sp, 48]
ldp x29, x30, [sp, 16]
ldr x23, [sp, 64]
add sp, sp, 96
ret
-.L1010:
+.L1030:
mov w2, 0
add x1, x29, 76
mov w0, w19
bl log2phys
tst x19, 2047
- bne .L1005
+ bne .L1025
ldr w2, [x29, 76]
- adrp x0, .LC29
+ adrp x0, .LC33
mov w1, w19
- add x0, x0, :lo12:.LC29
+ add x0, x0, :lo12:.LC33
bl printf
-.L1005:
+.L1025:
ldr w1, [x29, 76]
cmn w1, #1
- beq .L1007
+ beq .L1027
add x0, x20, :lo12:.LANCHOR138
str wzr, [x20, #:lo12:.LANCHOR138]
mov w2, 0
@@ -7231,25 +7266,25 @@ ftl_scan_all_data:
ldr w0, [x20, #:lo12:.LANCHOR138]
cmp w0, 256
ccmn w0, #1, 4, ne
- beq .L1008
+ beq .L1028
ldr w0, [x23, 8]
cmp w19, w0
- beq .L1007
-.L1008:
+ beq .L1027
+.L1028:
ldp x1, x0, [x22, 8]
ldr w2, [x1, 4]
str w2, [sp]
ldr w2, [x22, 4]
ldp w3, w4, [x0]
ldp w5, w6, [x0, 8]
- adrp x0, .LC30
+ adrp x0, .LC34
ldr w7, [x1]
- add x0, x0, :lo12:.LC30
+ add x0, x0, :lo12:.LC34
mov w1, w19
bl printf
-.L1007:
+.L1027:
add w19, w19, 1
- b .L1004
+ b .L1024
.size ftl_scan_all_data, .-ftl_scan_all_data
.section .text.FtlGcScanTempBlk,"ax",@progbits
.align 2
@@ -7259,37 +7294,37 @@ FtlGcScanTempBlk:
stp x29, x30, [sp, -144]!
add x29, sp, 0
stp x25, x26, [sp, 64]
- adrp x26, .LANCHOR160
+ adrp x25, .LANCHOR160
stp x19, x20, [sp, 16]
mov x19, x0
- ldrh w20, [x26, #:lo12:.LANCHOR160]
+ ldrh w20, [x25, #:lo12:.LANCHOR160]
mov w0, 65535
stp x21, x22, [sp, 32]
stp x23, x24, [sp, 48]
cmp w20, w0
- stp x27, x28, [sp, 80]
- beq .L1033
- cbnz w20, .L1013
-.L1014:
+ str x27, [sp, 80]
+ beq .L1053
+ cbnz w20, .L1033
+.L1034:
bl FtlGcPageVarInit
- b .L1015
-.L1033:
+ b .L1035
+.L1053:
mov w20, 0
-.L1013:
+.L1033:
adrp x0, .LANCHOR19
ldrh w0, [x0, #:lo12:.LANCHOR19]
cmp w0, w1
- beq .L1014
-.L1015:
- adrp x27, .LANCHOR152
- add x27, x27, :lo12:.LANCHOR152
-.L1016:
- ldrh w0, [x19]
- mov w23, 65535
+ beq .L1034
+.L1035:
+ adrp x26, .LANCHOR152
+ add x26, x26, :lo12:.LANCHOR152
+.L1050:
+ ldrh w1, [x19]
+ mov w0, 65535
strb wzr, [x19, 8]
- cmp w0, w23
- beq .L1017
-.L1032:
+ cmp w1, w0
+ beq .L1036
+.L1052:
adrp x1, .LANCHOR64
adrp x24, .LANCHOR103
add x4, x19, 16
@@ -7297,6 +7332,7 @@ FtlGcScanTempBlk:
ldr x5, [x1, #:lo12:.LANCHOR64]
adrp x1, .LANCHOR23
ldr x0, [x24, #:lo12:.LANCHOR103]
+ mov w10, 65535
ldrh w6, [x1, #:lo12:.LANCHOR23]
adrp x1, .LANCHOR65
ldr x7, [x1, #:lo12:.LANCHOR65]
@@ -7306,44 +7342,44 @@ FtlGcScanTempBlk:
ldrh w1, [x1, #:lo12:.LANCHOR3]
add x1, x1, 8
add x1, x19, x1, lsl 1
-.L1018:
- cmp x4, x1
- bne .L1020
+.L1037:
+ cmp x1, x4
+ bne .L1039
mov w1, w21
ubfiz x21, x21, 5, 16
mov x22, 0
mov w2, 0
bl FlashReadPages
-.L1021:
+.L1040:
cmp x21, x22
- bne .L1031
+ bne .L1051
adrp x0, .LANCHOR19
add w20, w20, 1
and w20, w20, 65535
ldrh w0, [x0, #:lo12:.LANCHOR19]
cmp w0, w20
- bhi .L1032
-.L1017:
+ bhi .L1052
+.L1036:
strh w20, [x19, 2]
mov w0, -1
strb wzr, [x19, 6]
mov w1, w20
- strh w0, [x26, #:lo12:.LANCHOR160]
+ strh w0, [x25, #:lo12:.LANCHOR160]
mov w2, 0
mov x0, x19
bl ftl_sb_update_avl_pages
mov w0, -1
+ 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 x27, x28, [sp, 80]
ldp x29, x30, [sp], 144
ret
-.L1020:
+.L1039:
ldrh w3, [x4]
- cmp w3, w23
- beq .L1019
+ cmp w3, w10
+ beq .L1038
ubfiz x2, x21, 5, 16
orr w3, w20, w3, lsl 10
add x2, x0, x2
@@ -7358,24 +7394,25 @@ FtlGcScanTempBlk:
asr w3, w3, 2
add x3, x7, x3, sxtw 2
str x3, [x2, 16]
-.L1019:
+.L1038:
add x4, x4, 2
- b .L1018
-.L1031:
- ldr x1, [x24, #:lo12:.LANCHOR103]
- add x0, x1, x22
- ldr w1, [x1, x22]
- ldr w28, [x0, 4]
- cbnz w1, .L1022
- ldr x25, [x0, 16]
- ldrh w0, [x25]
- cmp w0, w23
- beq .L1022
- ldr w0, [x25, 8]
- ldr w1, [x27]
+ b .L1037
+.L1051:
+ ldr x0, [x24, #:lo12:.LANCHOR103]
+ add x1, x0, x22
+ ldr w0, [x0, x22]
+ ldr w27, [x1, 4]
+ ldr x23, [x1, 16]
+ cbnz w0, .L1041
+ ldrh w1, [x23]
+ mov w0, 65535
+ cmp w1, w0
+ beq .L1063
+ ldr w0, [x23, 8]
+ ldr w1, [x26]
cmp w0, w1
- bls .L1024
-.L1022:
+ bls .L1043
+.L1063:
adrp x0, .LANCHOR42
ldrh w1, [x19]
mov w20, 0
@@ -7384,26 +7421,30 @@ FtlGcScanTempBlk:
ldrh w0, [x19]
bl INSERT_FREE_LIST
mov w0, -1
+ adrp x1, .LANCHOR145
strh w0, [x19]
+ strh w0, [x1, #:lo12:.LANCHOR145]
bl FtlGcPageVarInit
- b .L1016
-.L1024:
+ b .L1050
+.L1043:
add x1, x29, 108
mov w2, 0
bl log2phys
- ldr w0, [x25, 12]
+ ldr w0, [x23, 12]
ldr w1, [x29, 108]
cmp w0, w1
- beq .L1026
-.L1027:
- ldp w2, w0, [x25, 8]
- mov w1, w28
+ beq .L1045
+.L1047:
+ ldr w2, [x23, 8]
+.L1064:
+ ldr w0, [x23, 12]
+ mov w1, w27
add x22, x22, 32
bl FtlGcUpdatePage
- b .L1021
-.L1026:
+ b .L1040
+.L1045:
cmn w0, #1
- beq .L1027
+ beq .L1047
str w0, [x29, 116]
adrp x0, .LANCHOR110
mov w2, 0
@@ -7422,22 +7463,25 @@ FtlGcScanTempBlk:
add x2, x2, x22
mov x0, 0
ubfiz x1, x1, 9, 16
-.L1028:
+.L1048:
cmp x0, x1
- beq .L1027
+ beq .L1047
ldr x4, [x2, 8]
ldr w5, [x4, x0]
add x0, x0, 4
add x4, x3, x0
ldr w4, [x4, -4]
cmp w5, w4
- beq .L1028
+ beq .L1048
ldrh w1, [x19]
- adrp x0, .LC31
+ adrp x0, .LC35
ldr w2, [x29, 116]
- add x0, x0, :lo12:.LC31
+ add x0, x0, :lo12:.LC35
bl printf
- b .L1022
+ b .L1063
+.L1041:
+ mov w2, -1
+ b .L1064
.size FtlGcScanTempBlk, .-FtlGcScanTempBlk
.section .text.FtlVendorPartWrite,"ax",@progbits
.align 2
@@ -7457,7 +7501,7 @@ FtlVendorPartWrite:
stp x23, x24, [sp, 48]
stp x25, x26, [sp, 64]
cmp w1, w0
- bhi .L1051
+ bhi .L1073
adrp x0, .LANCHOR22
adrp x25, .LANCHOR12
adrp x26, .LANCHOR23
@@ -7467,9 +7511,9 @@ FtlVendorPartWrite:
add x26, x26, :lo12:.LANCHOR23
mov w23, 0
lsr w21, w28, w21
-.L1045:
- cbnz w20, .L1050
-.L1043:
+.L1067:
+ cbnz w20, .L1072
+.L1065:
mov w0, w23
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
@@ -7478,7 +7522,7 @@ FtlVendorPartWrite:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 208
ret
-.L1050:
+.L1072:
ldrh w1, [x25]
adrp x0, .LANCHOR123
adrp x27, .LANCHOR108
@@ -7491,9 +7535,9 @@ FtlVendorPartWrite:
and w19, w19, 65535
cmp w20, w19
csel w19, w0, w19, cc
- cbz w2, .L1047
+ cbz w2, .L1069
cmp w19, w1
- beq .L1047
+ beq .L1069
ldr x0, [x27, #:lo12:.LANCHOR108]
str x0, [x29, 120]
add x0, x29, 144
@@ -7503,7 +7547,7 @@ FtlVendorPartWrite:
mov w1, w2
add x0, x29, 112
bl FlashReadPages
-.L1048:
+.L1070:
lsl w4, w19, 9
ldr x0, [x27, #:lo12:.LANCHOR108]
lsl w22, w22, 7
@@ -7524,16 +7568,16 @@ FtlVendorPartWrite:
ldr w4, [x29, 108]
csinv w23, w23, wzr, ne
add x24, x24, x4, sxtw
- b .L1045
-.L1047:
+ b .L1067
+.L1069:
ldrh w2, [x26]
mov w1, 0
ldr x0, [x27, #:lo12:.LANCHOR108]
bl ftl_memset
- b .L1048
-.L1051:
+ b .L1070
+.L1073:
mov w23, -1
- b .L1043
+ b .L1065
.size FtlVendorPartWrite, .-FtlVendorPartWrite
.section .text.Ftl_save_ext_data,"ax",@progbits
.align 2
@@ -7546,7 +7590,7 @@ Ftl_save_ext_data:
mov w0, 19539
movk w0, 0x4654, lsl 16
cmp w1, w0
- bne .L1056
+ bne .L1078
mov w0, 72
mov w1, 1
movk w0, 0x5000, lsl 16
@@ -7589,7 +7633,7 @@ Ftl_save_ext_data:
str w0, [x2, 48]
mov w0, 0
b FtlVendorPartWrite
-.L1056:
+.L1078:
ret
.size Ftl_save_ext_data, .-Ftl_save_ext_data
.section .text.FtlEctTblFlush,"ax",@progbits
@@ -7600,20 +7644,20 @@ FtlEctTblFlush:
adrp x2, .LANCHOR164
ldrh w1, [x2, #:lo12:.LANCHOR164]
cmp w1, 31
- bhi .L1062
+ bhi .L1084
add w1, w1, 1
strh w1, [x2, #:lo12:.LANCHOR164]
mov w1, 1
-.L1059:
+.L1081:
adrp x2, .LANCHOR118
- cbnz w0, .L1060
+ cbnz w0, .L1082
ldr x0, [x2, #:lo12:.LANCHOR118]
ldr w3, [x0, 20]
ldr w0, [x0, 16]
add w1, w1, w3
cmp w0, w1
- bcc .L1064
-.L1060:
+ bcc .L1086
+.L1082:
stp x29, x30, [sp, -16]!
add x29, sp, 0
ldr x2, [x2, #:lo12:.LANCHOR118]
@@ -7636,10 +7680,10 @@ FtlEctTblFlush:
mov w0, 0
ldp x29, x30, [sp], 16
ret
-.L1062:
+.L1084:
mov w1, 32
- b .L1059
-.L1064:
+ b .L1081
+.L1086:
mov w0, 0
ret
.size FtlEctTblFlush, .-FtlEctTblFlush
@@ -7669,7 +7713,7 @@ FtlVendorPartRead:
stp x25, x26, [sp, 64]
stp x27, x28, [sp, 80]
cmp w1, w0
- bhi .L1076
+ bhi .L1098
adrp x0, .LANCHOR22
mov x25, x2
mov w24, 0
@@ -7679,9 +7723,9 @@ FtlVendorPartRead:
add x0, x0, :lo12:.LANCHOR12
str x0, [x29, 104]
lsr w20, w22, w20
-.L1069:
- cbnz w21, .L1075
-.L1067:
+.L1091:
+ cbnz w21, .L1097
+.L1089:
mov w0, w24
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
@@ -7690,7 +7734,7 @@ FtlVendorPartRead:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 208
ret
-.L1075:
+.L1097:
ldr x0, [x27, #:lo12:.LANCHOR123]
ldr w4, [x0, w20, uxtw 2]
ldr x0, [x29, 104]
@@ -7703,7 +7747,7 @@ FtlVendorPartRead:
cmp w21, w19
csel w19, w0, w19, cc
lsl w26, w19, 9
- cbz w4, .L1071
+ cbz w4, .L1093
adrp x28, .LANCHOR108
mov w2, 1
str w4, [x29, 96]
@@ -7723,12 +7767,12 @@ FtlVendorPartRead:
csinv w24, w24, wzr, ne
ldr w0, [x0, #:lo12:.LANCHOR138]
cmp w0, 256
- bne .L1073
+ bne .L1095
mov w2, w4
mov w1, w20
- adrp x0, .LC32
+ adrp x0, .LC36
str x28, [x29, 96]
- add x0, x0, :lo12:.LC32
+ add x0, x0, :lo12:.LC36
bl printf
ldr x2, [x28, #:lo12:.LANCHOR108]
mov w1, w20
@@ -7736,28 +7780,28 @@ FtlVendorPartRead:
add x0, x0, :lo12:.LANCHOR161
bl FtlMapWritePage
ldr x5, [x29, 96]
-.L1073:
+.L1095:
ldr x1, [x5, #:lo12:.LANCHOR108]
lsl w23, w23, 7
mov w2, w26
mov x0, x25
add x1, x1, x23, sxtw 2
bl ftl_memcpy
-.L1074:
+.L1096:
add w20, w20, 1
sub w21, w21, w19
add w22, w22, w19
add x25, x25, x26, sxtw
- b .L1069
-.L1071:
+ b .L1091
+.L1093:
mov w2, w26
mov w1, 0
mov x0, x25
bl ftl_memset
- b .L1074
-.L1076:
+ b .L1096
+.L1098:
mov w24, -1
- b .L1067
+ b .L1089
.size FtlVendorPartRead, .-FtlVendorPartRead
.section .text.FtlLoadEctTbl,"ax",@progbits
.align 2
@@ -7778,18 +7822,18 @@ FtlLoadEctTbl:
mov w0, 17221
movk w0, 0x4254, lsl 16
cmp w1, w0
- beq .L1079
- adrp x1, .LC33
- adrp x0, .LC34
- add x1, x1, :lo12:.LC33
- add x0, x0, :lo12:.LC34
+ beq .L1101
+ adrp x1, .LC37
+ adrp x0, .LC38
+ add x1, x1, :lo12:.LC37
+ add x0, x0, :lo12:.LC38
bl printf
ldr x0, [x19, #:lo12:.LANCHOR118]
mov w1, 0
ldrh w2, [x20, #:lo12:.LANCHOR116]
lsl w2, w2, 9
bl ftl_memset
-.L1079:
+.L1101:
mov w0, 0
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 32
@@ -7814,18 +7858,18 @@ Ftl_load_ext_data:
mov w20, 19539
movk w20, 0x4654, lsl 16
cmp w0, w20
- beq .L1082
+ beq .L1104
mov w2, 512
mov w1, 0
mov x0, x21
bl ftl_memset
str w20, [x19, #:lo12:.LANCHOR135]
-.L1082:
+.L1104:
ldr w1, [x19, #:lo12:.LANCHOR135]
add x0, x19, :lo12:.LANCHOR135
cmp w1, w20
adrp x1, .LANCHOR91
- bne .L1083
+ bne .L1105
adrp x2, .LANCHOR162
ldr w3, [x0, 88]
str w3, [x2, #:lo12:.LANCHOR162]
@@ -7860,7 +7904,7 @@ Ftl_load_ext_data:
ldr w2, [x0, 48]
adrp x0, .LANCHOR93
str w2, [x0, #:lo12:.LANCHOR93]
-.L1083:
+.L1105:
adrp x0, .LANCHOR14
adrp x2, .LANCHOR90
ldr w1, [x1, #:lo12:.LANCHOR91]
@@ -7873,8 +7917,8 @@ Ftl_load_ext_data:
ldp x29, x30, [sp], 48
ldrh w1, [x1, #:lo12:.LANCHOR5]
udiv w0, w0, w1
- adrp x1, .LANCHOR145
- str w0, [x1, #:lo12:.LANCHOR145]
+ adrp x1, .LANCHOR143
+ str w0, [x1, #:lo12:.LANCHOR143]
ret
.size Ftl_load_ext_data, .-Ftl_load_ext_data
.section .text.sftl_vendor_read,"ax",@progbits
@@ -7891,7 +7935,7 @@ sftl_vendor_read:
.type FtlMapBlkWriteDump_data, %function
FtlMapBlkWriteDump_data:
ldr w1, [x0, 56]
- cbz w1, .L1086
+ cbz w1, .L1108
stp x29, x30, [sp, -80]!
add x29, sp, 0
stp x19, x20, [sp, 16]
@@ -7912,16 +7956,16 @@ FtlMapBlkWriteDump_data:
str x24, [x21, 16]
str wzr, [x19, 56]
ldr x25, [x19, 40]
- cbz w0, .L1088
+ cbz w0, .L1110
adrp x1, .LANCHOR20
ldrh w1, [x1, #:lo12:.LANCHOR20]
sub w1, w1, #1
cmp w0, w1
- bge .L1088
+ bge .L1110
ldrh w1, [x19]
mov w2, 65535
cmp w1, w2
- beq .L1088
+ beq .L1110
ldr x2, [x19, 16]
ubfiz x1, x1, 1, 16
sub w0, w0, #1
@@ -7934,16 +7978,16 @@ FtlMapBlkWriteDump_data:
bl FlashReadPages
ldr w0, [x23, #:lo12:.LANCHOR138]
cmn w0, #1
- beq .L1088
+ beq .L1110
ldrh w1, [x24, 8]
ldr x2, [x19, 40]
ubfiz x0, x1, 2, 16
ldr w2, [x2, x0]
ldr w0, [x21, 4]
cmp w2, w0
- bne .L1088
+ bne .L1110
ldr x2, [x21, 8]
-.L1100:
+.L1122:
mov x0, x19
ldr x25, [sp, 64]
ldp x19, x20, [sp, 16]
@@ -7951,30 +7995,30 @@ FtlMapBlkWriteDump_data:
ldp x23, x24, [sp, 48]
ldp x29, x30, [sp], 80
b FtlMapWritePage
-.L1088:
+.L1110:
sub w20, w20, #1
and w20, w20, 65535
ubfiz x0, x20, 2, 16
ldr w1, [x25, x0]
add x0, x22, :lo12:.LANCHOR138
str w1, [x0, 4]
- cbz w1, .L1089
+ cbz w1, .L1111
mov w2, 1
mov w1, w2
bl FlashReadPages
-.L1090:
+.L1112:
add x22, x22, :lo12:.LANCHOR138
mov w1, w20
ldr x2, [x22, 8]
- b .L1100
-.L1089:
+ b .L1122
+.L1111:
adrp x1, .LANCHOR23
ldr x0, [x0, 8]
ldrh w2, [x1, #:lo12:.LANCHOR23]
mov w1, 255
bl ftl_memset
- b .L1090
-.L1086:
+ b .L1112
+.L1108:
ret
.size FtlMapBlkWriteDump_data, .-FtlMapBlkWriteDump_data
.section .text.FtlVpcTblFlush,"ax",@progbits
@@ -8094,7 +8138,7 @@ FtlVpcTblFlush:
add x24, x24, :lo12:.LANCHOR20
str w0, [x29, 108]
str x24, [x29, 96]
-.L1102:
+.L1124:
ldrh w2, [x28, 2]
ldrh w1, [x28]
ldr x0, [x22, #:lo12:.LANCHOR106]
@@ -8106,7 +8150,7 @@ FtlVpcTblFlush:
ldrh w0, [x24]
sub w0, w0, #1
cmp w2, w0
- blt .L1103
+ blt .L1125
ldrh w0, [x28, 4]
strh wzr, [x28, 2]
strh w1, [x28, 4]
@@ -8121,7 +8165,7 @@ FtlVpcTblFlush:
str w2, [x19, 4]
strh w0, [x27, 2]
str w1, [x27, 4]
-.L1103:
+.L1125:
ldrh w1, [x26, #:lo12:.LANCHOR23]
ldr x0, [x22, #:lo12:.LANCHOR106]
bl js_hash
@@ -8137,49 +8181,49 @@ FtlVpcTblFlush:
and w0, w0, 65535
strh w0, [x28, 2]
cmn w1, #1
- bne .L1104
+ bne .L1126
cmp w0, 1
- bne .L1105
+ bne .L1127
adrp x1, .LANCHOR165
adrp x0, .LC1
mov w2, 1138
add x1, x1, :lo12:.LANCHOR165
add x0, x0, :lo12:.LC1
bl printf
-.L1105:
+.L1127:
ldrh w0, [x28, 2]
cmp w0, 1
- bne .L1106
+ bne .L1128
ldr x0, [x29, 96]
ldrh w0, [x0]
sub w0, w0, #1
strh w0, [x28, 2]
-.L1106:
+.L1128:
add w20, w20, 1
and w20, w20, 65535
cmp w20, 3
- bls .L1102
+ bls .L1124
add x21, x21, :lo12:.LANCHOR138
- adrp x0, .LC35
+ adrp x0, .LC39
mov w2, w20
- add x0, x0, :lo12:.LC35
+ add x0, x0, :lo12:.LC39
ldr w1, [x21, 4]
bl printf
-.L1108:
- b .L1108
-.L1104:
+.L1130:
+ b .L1130
+.L1126:
cmp w0, 1
- beq .L1102
+ beq .L1124
cmp w1, 256
- beq .L1102
+ beq .L1124
ldr w1, [x29, 108]
mov w0, 65535
cmp w1, w0
- beq .L1109
+ beq .L1131
ldrh w0, [x29, 108]
mov w1, 1
bl FtlFreeSysBlkQueueIn
-.L1109:
+.L1131:
ldp x19, x20, [sp, 16]
mov w0, 0
ldp x21, x22, [sp, 32]
@@ -8212,14 +8256,14 @@ sftl_deinit:
adrp x0, .LANCHOR166
ldr w0, [x0, #:lo12:.LANCHOR166]
cmp w0, 1
- bne .L1122
+ bne .L1144
stp x29, x30, [sp, -16]!
add x29, sp, 0
bl FtlSysFlush
mov w0, 0
ldp x29, x30, [sp], 16
ret
-.L1122:
+.L1144:
mov w0, 0
ret
.size sftl_deinit, .-sftl_deinit
@@ -8238,56 +8282,56 @@ FtlDiscard:
str x23, [sp, 48]
ldr w1, [x1, #:lo12:.LANCHOR34]
cmp w2, w1
- bhi .L1133
+ bhi .L1155
cmp w19, 31
- bhi .L1127
-.L1141:
+ bhi .L1149
+.L1163:
mov w0, 0
-.L1125:
+.L1147:
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
ldr x23, [sp, 48]
ldp x29, x30, [sp], 80
ret
-.L1127:
+.L1149:
adrp x21, .LANCHOR12
ldrh w1, [x21, #:lo12:.LANCHOR12]
udiv w20, w0, w1
msub w0, w1, w20, w0
ands w0, w0, 65535
- beq .L1128
+ beq .L1150
sub w1, w1, w0
add w20, w20, 1
cmp w1, w19
csel w1, w1, w19, ls
sub w19, w19, w1, uxth
-.L1128:
+.L1150:
adrp x22, .LANCHOR167
adrp x23, .LANCHOR86
add x22, x22, :lo12:.LANCHOR167
add x23, x23, :lo12:.LANCHOR86
mov w0, -1
str w0, [x29, 76]
-.L1129:
+.L1151:
ldrh w0, [x21, #:lo12:.LANCHOR12]
cmp w19, w0
- bcs .L1131
+ bcs .L1153
adrp x0, .LANCHOR167
ldr w1, [x0, #:lo12:.LANCHOR167]
cmp w1, 32
- bls .L1141
+ bls .L1163
str wzr, [x0, #:lo12:.LANCHOR167]
bl l2p_flush
bl FtlVpcTblFlush
- b .L1141
-.L1131:
+ b .L1163
+.L1153:
mov w2, 0
add x1, x29, 72
mov w0, w20
bl log2phys
ldr w0, [x29, 72]
cmn w0, #1
- beq .L1130
+ beq .L1152
ldr w0, [x22]
mov w2, 1
add x1, x29, 76
@@ -8302,14 +8346,14 @@ FtlDiscard:
lsr w0, w0, 10
bl P2V_block_in_plane
bl decrement_vpc_count
-.L1130:
+.L1152:
ldrh w0, [x21, #:lo12:.LANCHOR12]
add w20, w20, 1
sub w19, w19, w0
- b .L1129
-.L1133:
+ b .L1151
+.L1155:
mov w0, -1
- b .L1125
+ b .L1147
.size FtlDiscard, .-FtlDiscard
.section .text.allocate_new_data_superblock,"ax",@progbits
.align 2
@@ -8325,25 +8369,25 @@ allocate_new_data_superblock:
adrp x0, .LANCHOR5
ldrh w0, [x0, #:lo12:.LANCHOR5]
cmp w0, w19
- bcs .L1143
+ bcs .L1165
adrp x1, .LANCHOR168
adrp x0, .LC1
- mov w2, 2760
+ mov w2, 2755
add x1, x1, :lo12:.LANCHOR168
add x0, x0, :lo12:.LC1
bl printf
-.L1143:
+.L1165:
mov w0, 65535
cmp w19, w0
- beq .L1144
+ beq .L1166
adrp x1, .LANCHOR42
ubfiz x0, x19, 1, 16
ldr x1, [x1, #:lo12:.LANCHOR42]
ldrh w0, [x1, x0]
- cbz w0, .L1145
+ cbz w0, .L1167
mov w0, w19
bl INSERT_DATA_LIST
-.L1144:
+.L1166:
adrp x1, .LANCHOR131
mov w0, 1
strb w0, [x21, 8]
@@ -8351,20 +8395,20 @@ allocate_new_data_superblock:
ldrh w0, [x1, #:lo12:.LANCHOR131]
mov x20, x1
cmp w0, w2
- beq .L1146
+ beq .L1168
cmp w19, w0
- bne .L1147
+ bne .L1169
adrp x2, .LANCHOR42
ubfiz x1, x0, 1, 16
ldr x2, [x2, #:lo12:.LANCHOR42]
ldrh w1, [x2, x1]
- cbz w1, .L1148
-.L1147:
+ cbz w1, .L1170
+.L1169:
bl update_vpc_list
-.L1148:
+.L1170:
mov w0, -1
strh w0, [x20, #:lo12:.LANCHOR131]
-.L1146:
+.L1168:
mov x0, x21
bl allocate_data_superblock
bl l2p_flush
@@ -8376,96 +8420,79 @@ allocate_new_data_superblock:
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 48
ret
-.L1145:
+.L1167:
mov w0, w19
bl INSERT_FREE_LIST
- b .L1144
+ b .L1166
.size allocate_new_data_superblock, .-allocate_new_data_superblock
.section .text.FtlProgPages,"ax",@progbits
.align 2
.global FtlProgPages
.type FtlProgPages, %function
FtlProgPages:
- stp x29, x30, [sp, -96]!
+ stp x29, x30, [sp, -80]!
mov w2, 0
add x29, sp, 0
stp x19, x20, [sp, 16]
- mov x19, x3
- stp x23, x24, [sp, 48]
- add x20, x0, 4
+ mov x20, x3
stp x21, x22, [sp, 32]
mov w21, w1
- str x25, [sp, 64]
+ stp x23, x24, [sp, 48]
ubfiz x21, x21, 5, 32
+ mov x22, x0
add x21, x21, 4
- adrp x24, .LANCHOR19
ldrb w3, [x3, 9]
- adrp x23, .LANCHOR135
- add x21, x0, x21
- add x24, x24, :lo12:.LANCHOR19
- add x23, x23, :lo12:.LANCHOR135
+ adrp x23, .LC40
+ adrp x24, .LANCHOR3
+ add x19, x22, 4
+ add x21, x22, x21
+ add x23, x23, :lo12:.LC40
+ add x24, x24, :lo12:.LANCHOR3
bl FlashProgPages
-.L1154:
- cmp x20, x21
- beq .L1161
- sub x22, x20, #4
- adrp x25, .LANCHOR42
- b .L1162
-.L1157:
- ldr w0, [x20]
+.L1176:
+ cmp x21, x19
+ beq .L1182
+ sub x22, x19, #4
+ b .L1183
+.L1178:
+ ldr w1, [x19]
+ mov x0, x23
+ bl printf
+ ldr w0, [x19]
lsr w0, w0, 10
bl P2V_block_in_plane
- ldrh w1, [x19]
- cmp w1, w0, uxth
- bne .L1155
- ldr x2, [x25, #:lo12:.LANCHOR42]
- ubfiz x1, x1, 1, 16
- ldrh w3, [x19, 4]
- ldrh w0, [x2, x1]
- sub w0, w0, w3
- strh w0, [x2, x1]
- strb wzr, [x19, 6]
- ldrh w0, [x24]
- strh w0, [x19, 2]
- strh wzr, [x19, 4]
-.L1155:
- ldrh w0, [x19, 4]
- cbnz w0, .L1156
- mov x0, x19
+ bl decrement_vpc_count
+ ldrh w0, [x20, 4]
+ cbnz w0, .L1177
+ mov x0, x20
bl allocate_new_data_superblock
-.L1156:
- ldr w0, [x23, 96]
- add w0, w0, 1
- str w0, [x23, 96]
- ldr w0, [x20]
- lsr w0, w0, 10
- bl FtlGcMarkBadPhyBlk
- mov x0, x19
+.L1177:
+ mov x0, x20
bl get_new_active_ppa
- str w0, [x20]
+ str w0, [x19]
mov w2, 0
- str w0, [x29, 92]
+ str w0, [x29, 76]
mov w1, 1
- ldrb w3, [x19, 9]
+ ldrb w3, [x20, 9]
mov x0, x22
bl FlashProgPages
-.L1162:
- ldr w0, [x20, -4]
- cmn w0, #1
- beq .L1157
- adrp x0, .LANCHOR3
- ldrb w1, [x19, 6]
- ldrh w0, [x0, #:lo12:.LANCHOR3]
+.L1183:
+ ldr w2, [x19, -4]
+ cmp w2, 256
+ ccmn w2, #1, 4, ne
+ beq .L1178
+ ldrb w1, [x20, 6]
+ ldrh w0, [x24]
cmp w1, w0
- bcc .L1158
+ bcc .L1179
adrp x1, .LANCHOR169
adrp x0, .LC1
- mov w2, 960
+ mov w2, 982
add x1, x1, :lo12:.LANCHOR169
add x0, x0, :lo12:.LC1
bl printf
-.L1158:
- add x1, x29, 96
+.L1179:
+ add x1, x29, 80
ldr w0, [x22, 4]
mov w2, 1
str w0, [x1, -4]!
@@ -8478,40 +8505,39 @@ FtlProgPages:
and w1, w0, 65535
mov w22, w1
cmn w3, #1
- beq .L1159
+ beq .L1180
adrp x2, .LANCHOR42
ubfiz x0, x1, 1, 16
ldr x2, [x2, #:lo12:.LANCHOR42]
ldrh w0, [x2, x0]
- cbnz w0, .L1160
- adrp x0, .LC36
+ cbnz w0, .L1181
+ adrp x0, .LC41
mov w2, 0
- add x0, x0, :lo12:.LC36
+ add x0, x0, :lo12:.LC41
bl printf
-.L1160:
+.L1181:
mov w0, w22
bl decrement_vpc_count
-.L1159:
- add x20, x20, 32
- b .L1154
-.L1161:
+.L1180:
+ add x19, x19, 32
+ b .L1176
+.L1182:
adrp x0, .LANCHOR3
- ldrb w1, [x19, 6]
+ ldrb w1, [x20, 6]
ldrh w0, [x0, #:lo12:.LANCHOR3]
cmp w1, w0
- bcc .L1153
+ bcc .L1175
adrp x1, .LANCHOR169
adrp x0, .LC1
- mov w2, 975
+ mov w2, 997
add x1, x1, :lo12:.LANCHOR169
add x0, x0, :lo12:.LC1
bl printf
-.L1153:
+.L1175:
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
ldp x23, x24, [sp, 48]
- ldr x25, [sp, 64]
- ldp x29, x30, [sp], 96
+ ldp x29, x30, [sp], 80
ret
.size FtlProgPages, .-FtlProgPages
.section .text.FtlGcFreeTempBlock,"ax",@progbits
@@ -8525,64 +8551,25 @@ FtlGcFreeTempBlock:
stp x19, x20, [sp, 16]
adrp x19, .LANCHOR53
stp x21, x22, [sp, 32]
- adrp x21, .LANCHOR133
- ldrh w20, [x19, #:lo12:.LANCHOR53]
+ ldrh w2, [x19, #:lo12:.LANCHOR53]
stp x23, x24, [sp, 48]
stp x25, x26, [sp, 64]
- cmp w20, w1
- str x27, [sp, 80]
- beq .L1169
+ cmp w2, w1
+ stp x27, x28, [sp, 80]
+ beq .L1190
adrp x1, .LANCHOR19
add x0, x19, :lo12:.LANCHOR53
ldrh w1, [x1, #:lo12:.LANCHOR19]
bl FtlGcScanTempBlk
str w0, [x29, 108]
- cmn w0, #1
- beq .L1169
- adrp x0, .LANCHOR43
- ubfiz x20, x20, 1, 16
- ldr x1, [x0, #:lo12:.LANCHOR43]
- ldrh w0, [x1, x20]
- cmp w0, 4
- bls .L1170
- sub w0, w0, #5
- strh w0, [x1, x20]
- mov w0, 1
- bl FtlEctTblFlush
-.L1170:
- ldr w0, [x21, #:lo12:.LANCHOR133]
- cbnz w0, .L1171
- adrp x0, .LANCHOR135
- add x0, x0, :lo12:.LANCHOR135
- ldr w1, [x0, 96]
- add w1, w1, 1
- str w1, [x0, 96]
- ldr w0, [x29, 108]
- lsr w0, w0, 10
- bl FtlBbmMapBadBlock
- bl FtlBbmTblFlush
-.L1171:
- str wzr, [x21, #:lo12:.LANCHOR133]
- mov w0, 1
-.L1168:
- 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
-.L1169:
+.L1190:
+ adrp x0, .LANCHOR133
ldrh w2, [x19, #:lo12:.LANCHOR53]
mov w1, 65535
- str wzr, [x21, #:lo12:.LANCHOR133]
- add x0, x19, :lo12:.LANCHOR53
+ str wzr, [x0, #:lo12:.LANCHOR133]
cmp w2, w1
- bne .L1173
-.L1188:
- mov w0, 0
- b .L1168
-.L1173:
+ add x0, x19, :lo12:.LANCHOR53
+ beq .L1192
ldrb w1, [x0, 7]
adrp x0, .LANCHOR19
adrp x20, .LANCHOR70
@@ -8591,25 +8578,25 @@ FtlGcFreeTempBlock:
ldrh w2, [x20, #:lo12:.LANCHOR70]
mul w1, w1, w3
cmp w2, w1
- beq .L1174
+ beq .L1193
adrp x1, .LANCHOR170
adrp x0, .LC1
- mov w2, 162
+ mov w2, 164
add x1, x1, :lo12:.LANCHOR170
add x0, x0, :lo12:.LC1
bl printf
-.L1174:
+.L1193:
add x0, x19, :lo12:.LANCHOR53
- adrp x23, .LANCHOR42
+ adrp x22, .LANCHOR42
ldrh w3, [x21, #:lo12:.LANCHOR19]
adrp x25, .LANCHOR152
ldrh w2, [x19, #:lo12:.LANCHOR53]
- adrp x26, .LANCHOR170
+ add x26, x20, :lo12:.LANCHOR70
ldrb w0, [x0, 7]
add x25, x25, :lo12:.LANCHOR152
- ldr x1, [x23, #:lo12:.LANCHOR42]
- add x26, x26, :lo12:.LANCHOR170
+ ldr x1, [x22, #:lo12:.LANCHOR42]
mov w21, 0
+ adrp x27, .LANCHOR71
mul w0, w0, w3
strh w0, [x1, x2, lsl 1]
adrp x1, .LANCHOR84
@@ -8617,19 +8604,19 @@ FtlGcFreeTempBlock:
ldr w2, [x1, #:lo12:.LANCHOR84]
add w0, w0, w2
str w0, [x1, #:lo12:.LANCHOR84]
-.L1175:
- ldrh w0, [x20, #:lo12:.LANCHOR70]
+.L1194:
+ ldrh w0, [x26]
cmp w0, w21
- bhi .L1179
+ bhi .L1198
mov w0, -1
bl decrement_vpc_count
ldrh w0, [x19, #:lo12:.LANCHOR53]
- ldr x2, [x23, #:lo12:.LANCHOR42]
+ ldr x2, [x22, #:lo12:.LANCHOR42]
ubfiz x1, x0, 1, 16
ldrh w1, [x2, x1]
- cbz w1, .L1180
+ cbz w1, .L1199
bl INSERT_DATA_LIST
-.L1181:
+.L1200:
adrp x0, .LANCHOR68
mov w21, -1
strh wzr, [x20, #:lo12:.LANCHOR70]
@@ -8637,66 +8624,69 @@ FtlGcFreeTempBlock:
strh wzr, [x0, #:lo12:.LANCHOR68]
bl l2p_flush
bl FtlVpcTblFlush
- adrp x0, .LANCHOR144
- strh w21, [x0, #:lo12:.LANCHOR144]
+ adrp x0, .LANCHOR145
+ strh w21, [x0, #:lo12:.LANCHOR145]
adrp x0, .LANCHOR48
ldrh w1, [x0, #:lo12:.LANCHOR48]
adrp x0, .LANCHOR171
ldrh w0, [x0, #:lo12:.LANCHOR171]
add w0, w0, w0, lsl 1
cmp w1, w0, lsr 2
- ble .L1188
+ ble .L1192
adrp x0, .LANCHOR100
mov w1, 20
strh w1, [x0, #:lo12:.LANCHOR100]
- b .L1188
-.L1179:
- adrp x0, .LANCHOR71
+.L1192:
+ 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
+.L1198:
mov w24, 12
- ldr x27, [x0, #:lo12:.LANCHOR71]
+ ldr x28, [x27, #:lo12:.LANCHOR71]
+ ldr w1, [x25]
umull x24, w21, w24
- ldr w0, [x25]
- add x22, x27, x24
- ldr w1, [x22, 8]
- cmp w1, w0
- bcc .L1176
- adrp x0, .LC1
- mov w2, 168
- mov x1, x26
- add x0, x0, :lo12:.LC1
- bl printf
-.L1176:
- ldr w0, [x22, 8]
+ add x23, x28, x24
+ ldr w0, [x23, 8]
+ cmp w0, w1
+ bcc .L1195
+.L1203:
+ ldrh w0, [x19, #:lo12:.LANCHOR53]
+ b .L1204
+.L1195:
add x1, x29, 108
mov w2, 0
bl log2phys
- ldr w0, [x27, x24]
+ ldr w0, [x28, x24]
ldr w1, [x29, 108]
cmp w0, w1
- bne .L1177
+ bne .L1197
lsr w0, w0, 10
bl P2V_block_in_plane
mov w24, w0
- ldr w0, [x22, 8]
+ ldr w0, [x23, 8]
mov w2, 1
- add x1, x22, 4
+ add x1, x23, 4
bl log2phys
mov w0, w24
-.L1187:
+.L1204:
bl decrement_vpc_count
-.L1178:
+ b .L1196
+.L1197:
+ ldr w0, [x23, 4]
+ cmp w1, w0
+ bne .L1203
+.L1196:
add w21, w21, 1
and w21, w21, 65535
- b .L1175
-.L1177:
- ldr w0, [x22, 4]
- cmp w1, w0
- beq .L1178
- ldrh w0, [x19, #:lo12:.LANCHOR53]
- b .L1187
-.L1180:
+ b .L1194
+.L1199:
bl INSERT_FREE_LIST
- b .L1181
+ b .L1200
.size FtlGcFreeTempBlock, .-FtlGcFreeTempBlock
.section .text.FtlGcPageRecovery,"ax",@progbits
.align 2
@@ -8715,7 +8705,7 @@ FtlGcPageRecovery:
ldrh w1, [x19, 2]
ldrh w0, [x20, #:lo12:.LANCHOR19]
cmp w1, w0
- bcc .L1189
+ bcc .L1205
adrp x0, .LANCHOR129
add x0, x0, :lo12:.LANCHOR129
bl FtlMapBlkWriteDump_data
@@ -8723,7 +8713,7 @@ FtlGcPageRecovery:
bl FtlGcFreeTempBlock
adrp x0, .LANCHOR133
str wzr, [x0, #:lo12:.LANCHOR133]
-.L1189:
+.L1205:
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 32
ret
@@ -8775,59 +8765,44 @@ Ftl_gc_temp_data_write_back:
ldr x0, [x20, #:lo12:.LANCHOR104]
bl FlashProgPages
mov w11, 0
-.L1195:
+.L1211:
ldr w1, [x19]
cmp w11, w1
- bcc .L1198
+ bcc .L1214
ldr x0, [x20, #:lo12:.LANCHOR104]
bl FtlGcBufFree
str wzr, [x19]
adrp x0, .LANCHOR53+4
ldrh w0, [x0, #:lo12:.LANCHOR53+4]
- cbnz w0, .L1199
+ cbnz w0, .L1216
mov w0, 1
bl FtlGcFreeTempBlock
- b .L1201
-.L1198:
+ mov w0, 1
+.L1210:
+ ldp x19, x20, [sp, 16]
+ ldp x29, x30, [sp], 32
+ ret
+.L1214:
ldr x2, [x20, #:lo12:.LANCHOR104]
ubfiz x0, x11, 5, 16
add x1, x2, x0
ldr w2, [x2, x0]
+ ldr x3, [x1, 16]
cmn w2, #1
- bne .L1196
- adrp x0, .LANCHOR53
- adrp x3, .LANCHOR42
- ldrh w4, [x0, #:lo12:.LANCHOR53]
- ldr x3, [x3, #:lo12:.LANCHOR42]
- strh wzr, [x3, x4, lsl 1]
- strh w2, [x0, #:lo12:.LANCHOR53]
- adrp x0, .LANCHOR135
- add x0, x0, :lo12:.LANCHOR135
- ldr w2, [x0, 96]
- add w2, w2, 1
- str w2, [x0, 96]
- ldr w0, [x1, 4]
- lsr w0, w0, 10
- bl FtlBbmMapBadBlock
- bl FtlBbmTblFlush
- bl FtlGcPageVarInit
-.L1201:
- mov w0, 1
-.L1194:
- ldp x19, x20, [sp, 16]
- ldp x29, x30, [sp], 32
- ret
-.L1196:
- ldr x0, [x1, 16]
+ bne .L1212
+.L1218:
ldr w1, [x1, 4]
- ldp w2, w0, [x0, 8]
+ ldr w0, [x3, 12]
bl FtlGcUpdatePage
add w11, w11, 1
and w11, w11, 65535
- b .L1195
-.L1199:
+ b .L1211
+.L1212:
+ ldr w2, [x3, 8]
+ b .L1218
+.L1216:
mov w0, 0
- b .L1194
+ b .L1210
.size Ftl_gc_temp_data_write_back, .-Ftl_gc_temp_data_write_back
.section .text.Ftl_get_new_temp_ppa,"ax",@progbits
.align 2
@@ -8842,11 +8817,11 @@ Ftl_get_new_temp_ppa:
mov x19, x0
ldrh w3, [x0, #:lo12:.LANCHOR53]
cmp w3, w2
- beq .L1203
+ beq .L1220
add x1, x0, :lo12:.LANCHOR53
ldrh w0, [x1, 4]
- cbnz w0, .L1204
-.L1203:
+ cbnz w0, .L1221
+.L1220:
mov w0, 0
bl FtlGcFreeTempBlock
add x0, x19, :lo12:.LANCHOR53
@@ -8860,7 +8835,7 @@ Ftl_get_new_temp_ppa:
mov w0, 0
bl FtlEctTblFlush
bl FtlVpcTblFlush
-.L1204:
+.L1221:
add x0, x19, :lo12:.LANCHOR53
ldr x19, [sp, 16]
ldp x29, x30, [sp], 32
@@ -8880,69 +8855,69 @@ rk_ftl_garbage_collect:
stp x23, x24, [sp, 48]
stp x25, x26, [sp, 64]
stp x27, x28, [sp, 80]
- cbnz w1, .L1258
- adrp x1, .LANCHOR45
- ldrh w1, [x1, #:lo12:.LANCHOR45]
+ cbnz w1, .L1280
+ adrp x1, .LANCHOR44
+ ldrh w1, [x1, #:lo12:.LANCHOR44]
cmp w1, 47
- bls .L1258
+ bls .L1280
adrp x1, .LANCHOR73
mov w4, 65535
ldrh w3, [x1, #:lo12:.LANCHOR73]
cmp w3, w4
- beq .L1208
+ beq .L1225
adrp x2, .LANCHOR72
ldrh w5, [x2, #:lo12:.LANCHOR72]
cmp w5, w4
- bne .L1208
+ bne .L1225
strh w3, [x2, #:lo12:.LANCHOR72]
mov w2, -1
strh w2, [x1, #:lo12:.LANCHOR73]
-.L1208:
- cbnz w0, .L1259
+.L1225:
+ cbnz w0, .L1281
adrp x1, .LANCHOR48
ldrh w1, [x1, #:lo12:.LANCHOR48]
cmp w1, 24
- bhi .L1260
+ bhi .L1282
adrp x2, .LANCHOR19
cmp w1, 16
ldrh w20, [x2, #:lo12:.LANCHOR19]
- bls .L1211
+ bls .L1228
lsr w20, w20, 5
-.L1210:
+.L1227:
adrp x2, .LANCHOR100
ldrh w3, [x2, #:lo12:.LANCHOR100]
cmp w3, w1
mov x3, x2
- bcs .L1214
+ bcs .L1231
adrp x1, .LANCHOR53
mov w4, 65535
ldrh w1, [x1, #:lo12:.LANCHOR53]
cmp w1, w4
- bne .L1215
+ bne .L1232
adrp x4, .LANCHOR72
ldrh w4, [x4, #:lo12:.LANCHOR72]
cmp w4, w1
- bne .L1215
+ bne .L1232
adrp x0, .LANCHOR172
ldrh w0, [x0, #:lo12:.LANCHOR172]
- cbnz w0, .L1216
+ cbnz w0, .L1233
adrp x1, .LANCHOR152
adrp x4, .LANCHOR59
ldr w1, [x1, #:lo12:.LANCHOR152]
ldr w4, [x4, #:lo12:.LANCHOR59]
add w1, w1, w1, lsl 1
cmp w4, w1, lsr 2
- bcs .L1217
-.L1216:
+ bcs .L1234
+.L1233:
adrp x1, .LANCHOR171
ldrh w1, [x1, #:lo12:.LANCHOR171]
add w1, w1, w1, lsl 1
asr w1, w1, 2
strh w1, [x3, #:lo12:.LANCHOR100]
-.L1218:
+.L1235:
adrp x1, .LANCHOR95
str wzr, [x1, #:lo12:.LANCHOR95]
-.L1206:
+.L1223:
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
ldp x23, x24, [sp, 48]
@@ -8950,79 +8925,79 @@ rk_ftl_garbage_collect:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 176
ret
-.L1211:
+.L1228:
cmp w1, 12
- bls .L1212
+ bls .L1229
lsr w20, w20, 4
- b .L1210
-.L1212:
+ b .L1227
+.L1229:
cmp w1, 8
- bls .L1210
+ bls .L1227
lsr w20, w20, 2
- b .L1210
-.L1260:
+ b .L1227
+.L1282:
mov w20, 1
- b .L1210
-.L1217:
+ b .L1227
+.L1234:
mov w1, 18
strh w1, [x2, #:lo12:.LANCHOR100]
- b .L1218
-.L1215:
+ b .L1235
+.L1232:
adrp x1, .LANCHOR171
ldrh w1, [x1, #:lo12:.LANCHOR171]
add w1, w1, w1, lsl 1
asr w1, w1, 2
strh w1, [x3, #:lo12:.LANCHOR100]
-.L1214:
+.L1231:
adrp x1, .LANCHOR74
ldrh w1, [x1, #:lo12:.LANCHOR74]
- cbz w1, .L1209
+ cbz w1, .L1226
add w20, w20, 32
and w20, w20, 65535
-.L1209:
- adrp x19, .LANCHOR144
+.L1226:
+ adrp x19, .LANCHOR145
str w0, [x29, 152]
mov w0, 65535
- ldrh w2, [x19, #:lo12:.LANCHOR144]
+ ldrh w2, [x19, #:lo12:.LANCHOR145]
cmp w2, w0
- bne .L1221
+ bne .L1238
adrp x0, .LANCHOR72
ldrh w1, [x0, #:lo12:.LANCHOR72]
cmp w1, w2
- beq .L1222
+ beq .L1239
adrp x2, .LANCHOR42
ubfiz x1, x1, 1, 16
ldr x2, [x2, #:lo12:.LANCHOR42]
ldrh w1, [x2, x1]
- cbnz w1, .L1223
+ cbnz w1, .L1240
mov w1, -1
strh w1, [x0, #:lo12:.LANCHOR72]
-.L1223:
+.L1240:
ldrh w1, [x0, #:lo12:.LANCHOR72]
- strh w1, [x19, #:lo12:.LANCHOR144]
+ strh w1, [x19, #:lo12:.LANCHOR145]
mov w1, -1
strh w1, [x0, #:lo12:.LANCHOR72]
-.L1222:
- add x0, x19, :lo12:.LANCHOR144
+.L1239:
+ add x0, x19, :lo12:.LANCHOR145
mov w1, 65535
strb wzr, [x0, 8]
- ldrh w0, [x19, #:lo12:.LANCHOR144]
+ ldrh w0, [x19, #:lo12:.LANCHOR145]
cmp w0, w1
- beq .L1221
+ beq .L1238
bl IsBlkInGcList
- cbz w0, .L1225
+ cbz w0, .L1242
mov w0, -1
- strh w0, [x19, #:lo12:.LANCHOR144]
-.L1225:
- ldrh w1, [x19, #:lo12:.LANCHOR144]
+ strh w0, [x19, #:lo12:.LANCHOR145]
+.L1242:
+ ldrh w1, [x19, #:lo12:.LANCHOR145]
mov w0, 65535
- add x22, x19, :lo12:.LANCHOR144
+ add x22, x19, :lo12:.LANCHOR145
cmp w1, w0
- beq .L1221
+ beq .L1238
mov x0, x22
bl make_superblock
adrp x0, .LANCHOR173
- ldrh w1, [x19, #:lo12:.LANCHOR144]
+ ldrh w1, [x19, #:lo12:.LANCHOR145]
strh wzr, [x22, 2]
strh wzr, [x0, #:lo12:.LANCHOR173]
adrp x0, .LANCHOR42
@@ -9031,56 +9006,60 @@ rk_ftl_garbage_collect:
ldrh w1, [x0, x1, lsl 1]
adrp x0, .LANCHOR174
strh w1, [x0, #:lo12:.LANCHOR174]
-.L1221:
+.L1238:
adrp x1, .LANCHOR51
- ldrh w0, [x19, #:lo12:.LANCHOR144]
+ ldrh w0, [x19, #:lo12:.LANCHOR145]
str x1, [x29, 128]
ldrh w2, [x1, #:lo12:.LANCHOR51]
cmp w2, w0
- beq .L1226
+ beq .L1243
adrp x1, .LANCHOR52
ldrh w1, [x1, #:lo12:.LANCHOR52]
cmp w1, w0
- bne .L1227
-.L1226:
+ beq .L1243
+ adrp x1, .LANCHOR53
+ ldrh w1, [x1, #:lo12:.LANCHOR53]
+ cmp w1, w0
+ bne .L1244
+.L1243:
mov w0, -1
- strh w0, [x19, #:lo12:.LANCHOR144]
-.L1227:
+ strh w0, [x19, #:lo12:.LANCHOR145]
+.L1244:
adrp x25, .LANCHOR102
add x26, x25, :lo12:.LANCHOR102
-.L1256:
- ldrh w1, [x19, #:lo12:.LANCHOR144]
+.L1278:
+ ldrh w1, [x19, #:lo12:.LANCHOR145]
mov w0, 65535
cmp w1, w0
- bne .L1228
+ bne .L1245
adrp x0, .LANCHOR95
adrp x22, .LANCHOR19
add x22, x22, :lo12:.LANCHOR19
str wzr, [x0, #:lo12:.LANCHOR95]
-.L1229:
+.L1246:
ldrh w5, [x25, #:lo12:.LANCHOR102]
add x7, x25, :lo12:.LANCHOR102
mov w0, w5
bl List_get_gc_head_node
and w6, w0, 65535
- strh w6, [x19, #:lo12:.LANCHOR144]
+ strh w6, [x19, #:lo12:.LANCHOR145]
mov w0, 65535
cmp w6, w0
- bne .L1230
+ bne .L1247
strh wzr, [x7]
mov w0, 8
- b .L1206
-.L1259:
+ b .L1223
+.L1281:
mov w20, 1
- b .L1209
-.L1230:
+ b .L1226
+.L1247:
mov w0, w6
bl IsBlkInGcList
add w5, w5, 1
- cbz w0, .L1231
+ cbz w0, .L1248
strh w5, [x25, #:lo12:.LANCHOR102]
- b .L1229
-.L1231:
+ b .L1246
+.L1248:
adrp x23, .LANCHOR42
adrp x4, .LANCHOR3
ldrh w0, [x22]
@@ -9092,82 +9071,82 @@ rk_ftl_garbage_collect:
ldrh w3, [x2, x1]
mul w0, w0, w4
cmp w3, w0, asr 1
- bgt .L1233
+ bgt .L1250
cmp w5, 48
- bls .L1234
+ bls .L1251
cmp w3, 8
- bls .L1234
+ bls .L1251
adrp x3, .LANCHOR68
ldrh w3, [x3, #:lo12:.LANCHOR68]
cmp w3, 35
- bhi .L1234
-.L1233:
+ bhi .L1251
+.L1250:
strh wzr, [x26]
-.L1234:
+.L1251:
ldrh w1, [x2, x1]
cmp w0, w1
- bgt .L1235
+ bgt .L1252
ldrh w0, [x26]
cmp w0, 3
- bhi .L1235
+ bhi .L1252
mov w0, -1
strh wzr, [x26]
- strh w0, [x19, #:lo12:.LANCHOR144]
-.L1286:
+ strh w0, [x19, #:lo12:.LANCHOR145]
+.L1311:
adrp x0, .LANCHOR172
ldrh w0, [x0, #:lo12:.LANCHOR172]
- b .L1206
-.L1235:
- cbnz w1, .L1236
+ b .L1223
+.L1252:
+ cbnz w1, .L1253
mov w0, -1
bl decrement_vpc_count
ldrh w0, [x26]
add w0, w0, 1
strh w0, [x26]
- b .L1229
-.L1236:
- add x0, x19, :lo12:.LANCHOR144
+ b .L1246
+.L1253:
+ add x0, x19, :lo12:.LANCHOR145
strb wzr, [x0, 8]
ldr x0, [x29, 128]
ldrh w0, [x0, #:lo12:.LANCHOR51]
cmp w0, w6
- bne .L1237
+ bne .L1254
adrp x1, .LANCHOR175
adrp x0, .LC1
- mov w2, 700
+ mov w2, 717
add x1, x1, :lo12:.LANCHOR175
add x0, x0, :lo12:.LC1
bl printf
-.L1237:
+.L1254:
adrp x0, .LANCHOR52
- ldrh w1, [x19, #:lo12:.LANCHOR144]
+ ldrh w1, [x19, #:lo12:.LANCHOR145]
ldrh w0, [x0, #:lo12:.LANCHOR52]
cmp w1, w0
- bne .L1238
+ bne .L1255
adrp x1, .LANCHOR175
adrp x0, .LC1
- mov w2, 701
+ mov w2, 718
add x1, x1, :lo12:.LANCHOR175
add x0, x0, :lo12:.LC1
bl printf
-.L1238:
+.L1255:
adrp x0, .LANCHOR53
- ldrh w1, [x19, #:lo12:.LANCHOR144]
+ ldrh w1, [x19, #:lo12:.LANCHOR145]
ldrh w0, [x0, #:lo12:.LANCHOR53]
cmp w1, w0
- bne .L1239
+ bne .L1256
adrp x1, .LANCHOR175
adrp x0, .LC1
- mov w2, 702
+ mov w2, 719
add x1, x1, :lo12:.LANCHOR175
add x0, x0, :lo12:.LC1
bl printf
-.L1239:
- add x22, x19, :lo12:.LANCHOR144
+.L1256:
+ add x22, x19, :lo12:.LANCHOR145
mov x0, x22
bl make_superblock
adrp x0, .LANCHOR173
- ldrh w1, [x19, #:lo12:.LANCHOR144]
+ ldrh w1, [x19, #:lo12:.LANCHOR145]
strh wzr, [x0, #:lo12:.LANCHOR173]
ldr x0, [x23, #:lo12:.LANCHOR42]
ldrh w1, [x0, x1, lsl 1]
@@ -9175,7 +9154,7 @@ rk_ftl_garbage_collect:
strh wzr, [x22, 2]
strh w1, [x0, #:lo12:.LANCHOR174]
strb wzr, [x22, 6]
-.L1228:
+.L1245:
mov w0, 1
str w0, [x21, #:lo12:.LANCHOR94]
adrp x0, .LANCHOR19
@@ -9183,9 +9162,9 @@ rk_ftl_garbage_collect:
ldrh w1, [x0, #:lo12:.LANCHOR19]
ldr w0, [x29, 152]
str w1, [x29, 156]
- cbz w0, .L1240
+ cbz w0, .L1257
adrp x0, .LANCHOR3
- ldrh w2, [x19, #:lo12:.LANCHOR144]
+ ldrh w2, [x19, #:lo12:.LANCHOR145]
ldrh w0, [x0, #:lo12:.LANCHOR3]
mul w0, w0, w1
adrp x1, .LANCHOR42
@@ -9196,24 +9175,24 @@ rk_ftl_garbage_collect:
sdiv w0, w0, w1
add w20, w20, w0
and w20, w20, 65535
-.L1240:
- add x0, x19, :lo12:.LANCHOR144
+.L1257:
+ add x0, x19, :lo12:.LANCHOR145
ldr w2, [x29, 156]
ldrh w0, [x0, 2]
add w1, w0, w20
cmp w1, w2
- ble .L1241
+ ble .L1258
sub w20, w2, w0
and w20, w20, 65535
-.L1241:
+.L1258:
adrp x0, .LANCHOR173
mov w28, 0
add x0, x0, :lo12:.LANCHOR173
str x0, [x29, 144]
-.L1242:
+.L1259:
cmp w20, w28, uxth
- bls .L1250
- add x1, x19, :lo12:.LANCHOR144
+ bls .L1267
+ add x1, x19, :lo12:.LANCHOR145
adrp x0, .LANCHOR3
adrp x23, .LANCHOR66
add x1, x1, 16
@@ -9224,25 +9203,25 @@ rk_ftl_garbage_collect:
ldr x0, [x23, #:lo12:.LANCHOR66]
mov w6, 65535
add w4, w4, w28
- b .L1251
-.L1244:
+ b .L1268
+.L1261:
ldrh w3, [x1]
cmp w3, w6
- beq .L1243
+ beq .L1260
ubfiz x5, x22, 5, 16
add w22, w22, 1
add x5, x0, x5
and w22, w22, 65535
orr w3, w4, w3, lsl 10
str w3, [x5, 4]
-.L1243:
+.L1260:
add w2, w2, 1
add x1, x1, 2
and w2, w2, 65535
-.L1251:
+.L1268:
cmp w2, w7
- bne .L1244
- add x1, x19, :lo12:.LANCHOR144
+ bne .L1261
+ add x1, x19, :lo12:.LANCHOR145
adrp x24, .LANCHOR62
add x24, x24, :lo12:.LANCHOR62
ldrb w2, [x1, 8]
@@ -9251,45 +9230,45 @@ rk_ftl_garbage_collect:
ubfiz x0, x22, 5, 16
mov x22, 0
str x0, [x29, 136]
-.L1245:
+.L1262:
ldr x0, [x29, 136]
cmp x22, x0
- bne .L1249
+ bne .L1266
add w28, w28, 1
- b .L1242
-.L1249:
+ b .L1259
+.L1266:
ldr x0, [x23, #:lo12:.LANCHOR66]
add x1, x0, x22
ldr w0, [x0, x22]
cmn w0, #1
- beq .L1246
+ beq .L1263
ldr x27, [x1, 16]
mov w0, 61589
ldrh w1, [x27]
cmp w1, w0
- bne .L1246
+ bne .L1263
ldr w4, [x27, 8]
cmn w4, #1
- bne .L1247
+ bne .L1264
str w4, [x29, 112]
- mov w2, 736
+ mov w2, 753
adrp x1, .LANCHOR175
adrp x0, .LC1
add x1, x1, :lo12:.LANCHOR175
add x0, x0, :lo12:.LC1
bl printf
ldr w4, [x29, 112]
-.L1247:
+.L1264:
mov w2, 0
- add x1, x29, 172
+ add x1, x29, 168
mov w0, w4
bl log2phys
ldr x0, [x23, #:lo12:.LANCHOR66]
- ldr w1, [x29, 172]
+ ldr w1, [x29, 168]
add x0, x0, x22
ldr w2, [x0, 4]
cmp w2, w1
- bne .L1246
+ bne .L1263
ldr x1, [x29, 144]
adrp x4, .LANCHOR104
ldr x2, [x29, 144]
@@ -9316,7 +9295,7 @@ rk_ftl_garbage_collect:
str x4, [x2, 8]
ldr x4, [x0, 16]
str x4, [x2, 16]
- ldr w2, [x29, 172]
+ ldr w2, [x29, 168]
str w2, [x27, 12]
adrp x2, .LANCHOR53
add x11, x2, :lo12:.LANCHOR53
@@ -9331,65 +9310,111 @@ rk_ftl_garbage_collect:
ldrb w1, [x11, 7]
ldr w0, [x24]
cmp w1, w0
- beq .L1248
+ beq .L1265
ldrh w0, [x11, 4]
- cbnz w0, .L1246
-.L1248:
+ cbnz w0, .L1263
+.L1265:
bl Ftl_gc_temp_data_write_back
- cbz w0, .L1246
-.L1287:
+ cbz w0, .L1263
+ add x0, x19, :lo12:.LANCHOR145
+ mov w1, -1
str wzr, [x21, #:lo12:.LANCHOR94]
- b .L1286
-.L1246:
+ strh w1, [x19, #:lo12:.LANCHOR145]
+ strh wzr, [x0, 2]
+ b .L1311
+.L1263:
add x22, x22, 32
- b .L1245
-.L1250:
- add x1, x19, :lo12:.LANCHOR144
+ b .L1262
+.L1267:
+ add x1, x19, :lo12:.LANCHOR145
ldrh w0, [x1, 2]
add w20, w20, w0
ldr w0, [x29, 156]
and w20, w20, 65535
strh w20, [x1, 2]
cmp w0, w20
- bhi .L1252
+ bhi .L1269
adrp x0, .LANCHOR62
ldr w0, [x0, #:lo12:.LANCHOR62]
- cbz w0, .L1253
+ cbz w0, .L1270
bl Ftl_gc_temp_data_write_back
- cbnz w0, .L1287
-.L1253:
+ cbz w0, .L1270
+ str wzr, [x21, #:lo12:.LANCHOR94]
+ b .L1311
+.L1270:
adrp x0, .LANCHOR173
ldrh w0, [x0, #:lo12:.LANCHOR173]
- cbnz w0, .L1254
- ldrh w0, [x19, #:lo12:.LANCHOR144]
- adrp x1, .LANCHOR42
- ldr x1, [x1, #:lo12:.LANCHOR42]
- lsl x0, x0, 1
- ldrh w2, [x1, x0]
- cbz w2, .L1254
- strh wzr, [x1, x0]
- ldrh w0, [x19, #:lo12:.LANCHOR144]
+ cbnz w0, .L1271
+ ldrh w1, [x19, #:lo12:.LANCHOR145]
+ adrp x20, .LANCHOR42
+ add x0, x19, :lo12:.LANCHOR145
+ ldr x3, [x20, #:lo12:.LANCHOR42]
+ ubfiz x2, x1, 1, 16
+ ldrh w4, [x3, x2]
+ cbz w4, .L1271
+ adrp x2, .LANCHOR174
+ adrp x22, .LANCHOR152
+ add x23, x22, :lo12:.LANCHOR152
+ mov w24, 0
+ ldrh w5, [x2, #:lo12:.LANCHOR174]
+ mov w3, 0
+ ldrh w2, [x0, 2]
+ adrp x0, .LC42
+ add x0, x0, :lo12:.LC42
+ bl printf
+.L1272:
+ ldr w0, [x23]
+ cmp w24, w0
+ bcs .L1274
+ mov w2, 0
+ add x1, x29, 172
+ mov w0, w24
+ bl log2phys
+ ldr w3, [x29, 172]
+ cmn w3, #1
+ beq .L1273
+ lsr w0, w3, 10
+ bl P2V_block_in_plane
+ ldrh w1, [x19, #:lo12:.LANCHOR145]
+ cmp w1, w0, uxth
+ bne .L1273
+ adrp x0, .LC43
+ mov w2, w3
+ mov w1, w24
+ add x0, x0, :lo12:.LC43
+ bl printf
+.L1274:
+ ldr w0, [x22, #:lo12:.LANCHOR152]
+ cmp w24, w0
+ bcc .L1271
+ ldrh w1, [x19, #:lo12:.LANCHOR145]
+ ldr x0, [x20, #:lo12:.LANCHOR42]
+ strh wzr, [x0, x1, lsl 1]
+ ldrh w0, [x19, #:lo12:.LANCHOR145]
bl update_vpc_list
bl l2p_flush
bl FtlVpcTblFlush
-.L1254:
+.L1271:
mov w0, -1
- strh w0, [x19, #:lo12:.LANCHOR144]
-.L1252:
+ strh w0, [x19, #:lo12:.LANCHOR145]
+.L1269:
adrp x0, .LANCHOR48
str wzr, [x21, #:lo12:.LANCHOR94]
ldrh w0, [x0, #:lo12:.LANCHOR48]
cmp w0, 2
- bhi .L1255
+ bhi .L1277
ldr x0, [x29, 120]
ldrh w20, [x0, #:lo12:.LANCHOR19]
- b .L1256
-.L1255:
+ b .L1278
+.L1273:
+ add w24, w24, 1
+ b .L1272
+.L1277:
add w0, w0, 1
- b .L1206
-.L1258:
+ b .L1223
+.L1280:
mov w0, 0
- b .L1206
+ b .L1223
.size rk_ftl_garbage_collect, .-rk_ftl_garbage_collect
.section .text.FtlRead,"ax",@progbits
.align 2
@@ -9408,13 +9433,13 @@ FtlRead:
mov w26, w2
stp x21, x22, [sp, 32]
stp x27, x28, [sp, 80]
- bne .L1289
+ bne .L1313
mov x2, x3
mov w1, w26
add w0, w19, 256
bl FtlVendorPartRead
mov w21, w0
-.L1288:
+.L1312:
mov w0, w21
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
@@ -9423,18 +9448,18 @@ FtlRead:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 176
ret
-.L1289:
+.L1313:
add w0, w1, w2
str w0, [x29, 136]
adrp x0, .LANCHOR34
add w1, w1, w2
ldr w0, [x0, #:lo12:.LANCHOR34]
cmp w1, w0
- bhi .L1310
+ bhi .L1334
adrp x0, .LANCHOR166
ldr w21, [x0, #:lo12:.LANCHOR166]
cmn w21, #1
- beq .L1288
+ beq .L1312
adrp x22, .LANCHOR12
adrp x25, .LANCHOR135
add x25, x25, :lo12:.LANCHOR135
@@ -9462,47 +9487,47 @@ FtlRead:
ldr w0, [x1, #:lo12:.LANCHOR89]
add w0, w0, w2
str w0, [x1, #:lo12:.LANCHOR89]
-.L1291:
+.L1315:
ldr w0, [x29, 156]
- cbnz w0, .L1308
+ cbnz w0, .L1332
adrp x0, .LANCHOR74
ldrh w0, [x0, #:lo12:.LANCHOR74]
- cbnz w0, .L1309
+ cbnz w0, .L1333
adrp x0, .LANCHOR48
ldrh w0, [x0, #:lo12:.LANCHOR48]
cmp w0, 31
- bhi .L1288
-.L1309:
+ bhi .L1312
+.L1333:
mov w1, 1
mov w0, 0
bl rk_ftl_garbage_collect
- b .L1288
-.L1308:
+ b .L1312
+.L1332:
add x1, x29, 172
mov w2, 0
mov w0, w20
bl log2phys
ldr w1, [x29, 172]
cmn w1, #1
- bne .L1292
+ bne .L1316
add x5, x22, :lo12:.LANCHOR12
mov w4, 0
-.L1293:
+.L1317:
ldrh w0, [x5]
cmp w4, w0
- bcc .L1295
-.L1296:
+ bcc .L1319
+.L1320:
ldr w0, [x29, 156]
add w20, w20, 1
subs w0, w0, #1
str w0, [x29, 156]
- beq .L1300
+ beq .L1324
adrp x0, .LANCHOR3
ldrh w0, [x0, #:lo12:.LANCHOR3]
cmp w27, w0, lsl 2
- bne .L1291
-.L1300:
- cbz w27, .L1291
+ bne .L1315
+.L1324:
+ cbz w27, .L1315
ldr x0, [x28, #:lo12:.LANCHOR103]
mov w1, w27
mov w2, 0
@@ -9521,57 +9546,57 @@ FtlRead:
str x0, [x29, 104]
add x0, x22, :lo12:.LANCHOR12
str x0, [x29, 96]
-.L1307:
+.L1331:
ldr x0, [x28, #:lo12:.LANCHOR103]
ldr w2, [x29, 152]
add x0, x0, x27
ldr w1, [x0, 24]
cmp w2, w1
- bne .L1302
+ bne .L1326
ldr x1, [x0, 8]
adrp x0, .LANCHOR109
ldr x0, [x0, #:lo12:.LANCHOR109]
cmp x1, x0
- bne .L1303
+ bne .L1327
ldr x0, [x29, 128]
ldr w2, [x29, 120]
add x1, x1, x0
mov x0, x23
-.L1321:
+.L1345:
bl ftl_memcpy
-.L1303:
+.L1327:
ldr x0, [x28, #:lo12:.LANCHOR103]
add x0, x0, x27
ldr x1, [x0, 16]
ldr w2, [x0, 24]
ldr w1, [x1, 8]
cmp w2, w1
- beq .L1304
+ beq .L1328
ldr w1, [x25, 72]
add w1, w1, 1
str w1, [x25, 72]
-.L1304:
+.L1328:
ldr w1, [x0]
cmn w1, #1
- bne .L1305
+ bne .L1329
ldr w0, [x25, 72]
mov w21, w1
add w0, w0, 1
str w0, [x25, 72]
-.L1306:
+.L1330:
ldr x0, [x29, 104]
add x27, x27, 32
cmp x0, x27
- bne .L1307
+ bne .L1331
mov w27, 0
- b .L1291
-.L1295:
+ b .L1315
+.L1319:
madd w0, w20, w0, w4
cmp w19, w0
- bhi .L1294
+ bhi .L1318
ldr w1, [x29, 136]
cmp w1, w0
- bls .L1294
+ bls .L1318
sub w0, w0, w19
str x5, [x29, 120]
lsl w0, w0, 9
@@ -9582,17 +9607,17 @@ FtlRead:
bl ftl_memset
ldr w4, [x29, 128]
ldr x5, [x29, 120]
-.L1294:
+.L1318:
add w4, w4, 1
- b .L1293
-.L1292:
+ b .L1317
+.L1316:
ldr x2, [x28, #:lo12:.LANCHOR103]
ubfiz x0, x27, 5, 32
add x0, x2, x0
str w1, [x0, 4]
ldr w1, [x29, 152]
cmp w20, w1
- bne .L1297
+ bne .L1321
adrp x1, .LANCHOR109
ldr x1, [x1, #:lo12:.LANCHOR109]
str x1, [x0, 8]
@@ -9605,9 +9630,9 @@ FtlRead:
csel w2, w26, w2, ls
str w2, [x29, 144]
cmp w1, w2
- bne .L1298
+ bne .L1322
str x23, [x0, 8]
-.L1298:
+.L1322:
adrp x1, .LANCHOR24
adrp x2, .LANCHOR115
str w20, [x0, 24]
@@ -9618,10 +9643,10 @@ FtlRead:
and x1, x1, 4294967292
add x1, x2, x1
str x1, [x0, 16]
- b .L1296
-.L1297:
+ b .L1320
+.L1321:
cmp w20, w24
- bne .L1299
+ bne .L1323
ldrh w2, [x22, #:lo12:.LANCHOR12]
adrp x1, .LANCHOR110
ldr w3, [x29, 136]
@@ -9631,25 +9656,25 @@ FtlRead:
sub w3, w3, w1
str w3, [x29, 140]
cmp w2, w3
- bne .L1298
-.L1320:
+ bne .L1322
+.L1344:
sub w1, w1, w19
lsl w1, w1, 9
add x1, x23, x1
str x1, [x0, 8]
- b .L1298
-.L1299:
+ b .L1322
+.L1323:
ldrh w1, [x22, #:lo12:.LANCHOR12]
mul w1, w1, w20
- b .L1320
-.L1302:
+ b .L1344
+.L1326:
cmp w24, w1
- bne .L1303
+ bne .L1327
ldr x1, [x0, 8]
adrp x0, .LANCHOR110
ldr x0, [x0, #:lo12:.LANCHOR110]
cmp x1, x0
- bne .L1303
+ bne .L1327
ldr x0, [x29, 96]
ldr w2, [x29, 116]
ldrh w0, [x0]
@@ -9657,18 +9682,18 @@ FtlRead:
sub w0, w0, w19
lsl w0, w0, 9
add x0, x23, x0
- b .L1321
-.L1305:
+ b .L1345
+.L1329:
cmp w1, 256
- bne .L1306
+ bne .L1330
ldr w0, [x0, 4]
lsr w0, w0, 10
bl P2V_block_in_plane
bl FtlGcRefreshBlock
- b .L1306
-.L1310:
+ b .L1330
+.L1334:
mov w21, -1
- b .L1288
+ b .L1312
.size FtlRead, .-FtlRead
.section .text.sftl_read,"ax",@progbits
.align 2
@@ -9690,20 +9715,20 @@ FtlWrite:
and w0, w0, 255
cmp w0, 16
add x29, sp, 0
- stp x21, x22, [sp, 32]
- mov w21, w1
+ stp x23, x24, [sp, 48]
+ mov w23, w1
stp x25, x26, [sp, 64]
mov x26, x3
stp x19, x20, [sp, 16]
- stp x23, x24, [sp, 48]
+ stp x21, x22, [sp, 32]
stp x27, x28, [sp, 80]
- str w2, [x29, 164]
- bne .L1324
+ str w2, [x29, 172]
+ bne .L1348
add w0, w1, 256
- ldr w1, [x29, 164]
+ ldr w1, [x29, 172]
mov x2, x3
bl FtlVendorPartWrite
-.L1323:
+.L1347:
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
ldp x23, x24, [sp, 48]
@@ -9711,46 +9736,47 @@ FtlWrite:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 224
ret
-.L1324:
- ldr w0, [x29, 164]
+.L1348:
+ ldr w0, [x29, 172]
add w0, w1, w0
str w0, [x29, 152]
adrp x0, .LANCHOR34
ldr w1, [x29, 152]
ldr w0, [x0, #:lo12:.LANCHOR34]
cmp w1, w0
- bhi .L1356
+ bhi .L1380
adrp x0, .LANCHOR166
ldr w0, [x0, #:lo12:.LANCHOR166]
cmn w0, #1
- beq .L1323
+ beq .L1347
adrp x0, .LANCHOR176
mov w1, 2048
- adrp x22, .LANCHOR12
- ldr w2, [x29, 164]
+ ldr w2, [x29, 152]
str w1, [x0, #:lo12:.LANCHOR176]
- ldr w1, [x29, 152]
- ldrh w0, [x22, #:lo12:.LANCHOR12]
- sub w1, w1, #1
- udiv w25, w21, w0
- udiv w0, w1, w0
- adrp x1, .LANCHOR162
+ adrp x1, .LANCHOR12
+ sub w2, w2, #1
+ ldr w3, [x29, 172]
+ ldrh w0, [x1, #:lo12:.LANCHOR12]
+ str x1, [x29, 160]
+ udiv w25, w23, w0
+ udiv w0, w2, w0
+ adrp x2, .LANCHOR162
mov w19, w25
str w0, [x29, 144]
sub w0, w0, w25
add w24, w0, 1
str w0, [x29, 140]
- ldr w0, [x1, #:lo12:.LANCHOR162]
- add w0, w0, w2
- str w0, [x1, #:lo12:.LANCHOR162]
- adrp x1, .LANCHOR85
- ldr w0, [x1, #:lo12:.LANCHOR85]
+ ldr w0, [x2, #:lo12:.LANCHOR162]
+ add w0, w0, w3
+ str w0, [x2, #:lo12:.LANCHOR162]
+ adrp x2, .LANCHOR85
+ ldr w0, [x2, #:lo12:.LANCHOR85]
add w0, w0, w24
- str w0, [x1, #:lo12:.LANCHOR85]
+ str w0, [x2, #:lo12:.LANCHOR85]
adrp x0, .LANCHOR51
add x20, x0, :lo12:.LANCHOR51
-.L1326:
- cbnz w24, .L1351
+.L1350:
+ cbnz w24, .L1375
ldr w1, [x29, 140]
mov w0, 0
bl rk_ftl_garbage_collect
@@ -9758,11 +9784,11 @@ FtlWrite:
mov x22, x0
ldrh w1, [x0, #:lo12:.LANCHOR48]
cmp w1, 5
- bls .L1352
-.L1354:
+ bls .L1376
+.L1378:
mov w0, 0
- b .L1323
-.L1351:
+ b .L1347
+.L1375:
adrp x0, .LANCHOR51
add x0, x0, :lo12:.LANCHOR51
adrp x1, .LANCHOR3
@@ -9770,19 +9796,19 @@ FtlWrite:
ldrb w2, [x0, 6]
ldrh w0, [x1, #:lo12:.LANCHOR3]
cmp w2, w0
- bcc .L1327
+ bcc .L1351
adrp x1, .LANCHOR177
adrp x0, .LC1
- mov w2, 1016
+ mov w2, 1038
add x1, x1, :lo12:.LANCHOR177
add x0, x0, :lo12:.LC1
bl printf
-.L1327:
+.L1351:
ldrh w0, [x20, 4]
- cbnz w0, .L1328
+ cbnz w0, .L1352
mov x0, x20
bl allocate_new_data_superblock
-.L1328:
+.L1352:
ldrb w0, [x20, 7]
ldrh w1, [x20, 4]
lsl w0, w0, 2
@@ -9795,244 +9821,251 @@ FtlWrite:
ldr x0, [x29, 112]
ldrh w0, [x0, #:lo12:.LANCHOR3]
cmp w1, w0
- bcc .L1329
+ bcc .L1353
adrp x1, .LANCHOR177
adrp x0, .LC1
- mov w2, 1049
+ mov w2, 1071
add x1, x1, :lo12:.LANCHOR177
add x0, x0, :lo12:.LC1
bl printf
-.L1329:
+.L1353:
adrp x0, .LANCHOR24
add x0, x0, :lo12:.LANCHOR24
- str xzr, [x29, 168]
+ mov x28, 0
str x0, [x29, 104]
adrp x0, .LANCHOR23
add x0, x0, :lo12:.LANCHOR23
str x0, [x29, 96]
-.L1330:
- ldr w1, [x29, 148]
+.L1354:
+ ldr w0, [x29, 148]
+ mov w22, w28
adrp x27, .LANCHOR105
- ldr w23, [x29, 168]
- cmp w23, w1
- bcc .L1349
- mov x23, x1
-.L1331:
+ cmp w28, w0
+ bcc .L1373
+ mov x22, x0
+.L1355:
ldr x0, [x27, #:lo12:.LANCHOR105]
mov x3, x20
mov w2, 0
- mov w1, w23
+ mov w1, w22
bl FtlProgPages
- cmp w24, w23
- bcs .L1350
+ cmp w24, w22
+ bcs .L1374
adrp x1, .LANCHOR177
adrp x0, .LC1
- mov w2, 1126
+ mov w2, 1149
add x1, x1, :lo12:.LANCHOR177
add x0, x0, :lo12:.LC1
bl printf
-.L1350:
- sub w24, w24, w23
- b .L1326
-.L1349:
+.L1374:
+ sub w24, w24, w22
+ b .L1350
+.L1373:
ldrh w0, [x20, 4]
- cbz w0, .L1331
+ cbz w0, .L1355
add x1, x29, 188
mov w2, 0
mov w0, w19
bl log2phys
mov x0, x20
+ lsl x21, x28, 5
bl get_new_active_ppa
- ldr x1, [x29, 168]
- lsl x28, x1, 5
ldr x1, [x27, #:lo12:.LANCHOR105]
- add x1, x1, x28
+ add x1, x1, x21
str w0, [x1, 4]
ldr x0, [x29, 104]
str w19, [x1, 24]
ldrh w2, [x0]
- mul w23, w23, w2
- and x0, x23, 4294967292
+ mul w22, w22, w2
+ and x0, x22, 4294967292
str x0, [x29, 128]
adrp x0, .LANCHOR115
ldr x3, [x29, 128]
ldr x0, [x0, #:lo12:.LANCHOR115]
str x0, [x29, 120]
- add x23, x0, x3
- str x23, [x1, 16]
- mov x0, x23
+ add x22, x0, x3
+ str x22, [x1, 16]
+ mov x0, x22
mov w1, 0
bl ftl_memset
ldr w0, [x29, 144]
cmp w19, w25
ccmp w19, w0, 4, ne
- bne .L1332
+ bne .L1356
cmp w19, w25
- bne .L1333
- ldrh w2, [x22, #:lo12:.LANCHOR12]
- udiv w0, w21, w2
- msub w0, w0, w2, w21
+ ldr x0, [x29, 160]
+ bne .L1357
+ ldrh w2, [x0, #:lo12:.LANCHOR12]
+ udiv w0, w23, w2
+ msub w0, w0, w2, w23
str w0, [x29, 156]
sub w2, w2, w0
- ldr w0, [x29, 164]
+ ldr w0, [x29, 172]
cmp w2, w0
csel w0, w2, w0, ls
- str w0, [x29, 160]
-.L1334:
- ldrh w0, [x22, #:lo12:.LANCHOR12]
- ldr w1, [x29, 160]
+ str w0, [x29, 168]
+.L1358:
+ ldr x0, [x29, 160]
+ ldr w1, [x29, 168]
+ ldrh w0, [x0, #:lo12:.LANCHOR12]
cmp w1, w0
ldr x0, [x27, #:lo12:.LANCHOR105]
- bne .L1335
- add x3, x0, x28
+ bne .L1359
+ add x21, x0, x21
cmp w19, w25
- bne .L1336
- str x26, [x3, 8]
-.L1337:
+ bne .L1360
+ str x26, [x21, 8]
+.L1361:
ldr x0, [x29, 112]
ldrb w1, [x20, 6]
ldrh w0, [x0, #:lo12:.LANCHOR3]
cmp w1, w0
- bcc .L1346
+ bcc .L1370
adrp x1, .LANCHOR177
adrp x0, .LC1
- mov w2, 1117
+ mov w2, 1140
add x1, x1, :lo12:.LANCHOR177
add x0, x0, :lo12:.LC1
bl printf
-.L1346:
+.L1370:
ldp x1, x2, [x29, 120]
mov w0, -3947
+ add x28, x28, 1
strh w0, [x1, x2]
adrp x1, .LANCHOR83
ldr w0, [x1, #:lo12:.LANCHOR83]
- stp w0, w19, [x23, 4]
+ stp w0, w19, [x22, 4]
add w19, w19, 1
add w0, w0, 1
cmn w0, #1
csel w0, w0, wzr, ne
str w0, [x1, #:lo12:.LANCHOR83]
ldr w0, [x29, 188]
- str w0, [x23, 12]
+ str w0, [x22, 12]
ldrh w0, [x20]
- strh w0, [x23, 2]
- ldr x0, [x29, 168]
- add x0, x0, 1
- str x0, [x29, 168]
- b .L1330
-.L1333:
+ strh w0, [x22, 2]
+ b .L1354
+.L1357:
+ ldrh w2, [x0, #:lo12:.LANCHOR12]
ldr w0, [x29, 152]
- ldrh w2, [x22, #:lo12:.LANCHOR12]
+ str wzr, [x29, 156]
msub w2, w19, w2, w0
and w0, w2, 65535
- stp wzr, w0, [x29, 156]
- b .L1334
-.L1336:
- ldr w0, [x29, 160]
-.L1364:
+ str w0, [x29, 168]
+ b .L1358
+.L1360:
+ ldr w0, [x29, 168]
+.L1388:
mul w0, w0, w19
- sub w0, w0, w21
+ sub w0, w0, w23
lsl w0, w0, 9
add x0, x26, x0
- str x0, [x3, 8]
- b .L1337
-.L1335:
- add x0, x0, x28
+ str x0, [x21, 8]
+ b .L1361
+.L1359:
+ add x0, x0, x21
cmp w19, w25
- bne .L1338
+ bne .L1362
adrp x1, .LANCHOR109
ldr x1, [x1, #:lo12:.LANCHOR109]
-.L1363:
+.L1387:
str x1, [x0, 8]
ldr w0, [x29, 188]
cmn w0, #1
- beq .L1340
+ beq .L1364
str w0, [x29, 196]
mov w2, 0
ldr x0, [x27, #:lo12:.LANCHOR105]
str w19, [x29, 216]
- add x0, x0, x28
+ add x0, x0, x21
ldp x1, x0, [x0, 8]
stp x1, x0, [x29, 200]
mov w1, 1
add x0, x29, 192
bl FlashReadPages
- ldr w0, [x29, 192]
- cmn w0, #1
- bne .L1341
+ ldr w3, [x29, 192]
+ cmn w3, #1
+ bne .L1365
adrp x0, .LANCHOR135
add x0, x0, :lo12:.LANCHOR135
+ mov w2, w19
ldr w1, [x0, 72]
add w1, w1, 1
str w1, [x0, 72]
-.L1344:
- ldr w0, [x29, 160]
+ ldr w1, [x22, 8]
+ adrp x0, .LC44
+ add x0, x0, :lo12:.LC44
+ bl printf
+.L1368:
+ ldr w0, [x29, 168]
cmp w19, w25
lsl w2, w0, 9
- bne .L1345
+ bne .L1369
ldr x0, [x27, #:lo12:.LANCHOR105]
mov x1, x26
- add x3, x0, x28
+ add x21, x0, x21
ldr w0, [x29, 156]
- ldr x3, [x3, 8]
+ ldr x3, [x21, 8]
lsl w0, w0, 9
add x0, x3, x0
-.L1365:
+.L1389:
bl ftl_memcpy
- b .L1337
-.L1338:
+ b .L1361
+.L1362:
adrp x1, .LANCHOR110
ldr x1, [x1, #:lo12:.LANCHOR110]
- b .L1363
-.L1341:
- ldr w1, [x23, 8]
+ b .L1387
+.L1365:
+ ldr w1, [x22, 8]
cmp w19, w1
- beq .L1343
+ beq .L1367
adrp x0, .LANCHOR135
add x0, x0, :lo12:.LANCHOR135
ldr w2, [x0, 72]
add w2, w2, 1
str w2, [x0, 72]
- adrp x0, .LC37
+ adrp x0, .LC45
mov w2, w19
- add x0, x0, :lo12:.LC37
+ add x0, x0, :lo12:.LC45
bl printf
-.L1343:
- ldr w0, [x23, 8]
+.L1367:
+ ldr w0, [x22, 8]
cmp w19, w0
- beq .L1344
- mov w2, 1102
+ beq .L1368
+ mov w2, 1125
adrp x1, .LANCHOR177
adrp x0, .LC1
add x1, x1, :lo12:.LANCHOR177
add x0, x0, :lo12:.LC1
bl printf
- b .L1344
-.L1340:
+ b .L1368
+.L1364:
ldr x0, [x27, #:lo12:.LANCHOR105]
ldr x1, [x29, 96]
- add x0, x0, x28
+ add x0, x0, x21
ldrh w2, [x1]
mov w1, 0
ldr x0, [x0, 8]
bl ftl_memset
- b .L1344
-.L1345:
- ldrh w1, [x22, #:lo12:.LANCHOR12]
+ b .L1368
+.L1369:
+ ldr x0, [x29, 160]
+ ldrh w1, [x0, #:lo12:.LANCHOR12]
ldr x0, [x27, #:lo12:.LANCHOR105]
- add x3, x0, x28
+ add x21, x0, x21
mul w1, w1, w19
- sub w1, w1, w21
- ldr x0, [x3, 8]
+ sub w1, w1, w23
+ ldr x0, [x21, 8]
lsl w1, w1, 9
add x1, x26, x1
- b .L1365
-.L1332:
+ b .L1389
+.L1356:
ldr x0, [x27, #:lo12:.LANCHOR105]
- add x3, x0, x28
- ldrh w0, [x22, #:lo12:.LANCHOR12]
- b .L1364
-.L1352:
+ add x21, x0, x21
+ ldr x0, [x29, 160]
+ ldrh w0, [x0, #:lo12:.LANCHOR12]
+ b .L1388
+.L1376:
adrp x23, .LANCHOR72
adrp x20, .LANCHOR101
adrp x21, .LANCHOR100
@@ -10040,19 +10073,19 @@ FtlWrite:
add x20, x20, :lo12:.LANCHOR101
add x21, x21, :lo12:.LANCHOR100
mov w19, 256
-.L1355:
- adrp x0, .LANCHOR144
+.L1379:
+ adrp x0, .LANCHOR145
mov w1, 65535
- ldrh w0, [x0, #:lo12:.LANCHOR144]
+ ldrh w0, [x0, #:lo12:.LANCHOR145]
cmp w0, w1
- bne .L1353
+ bne .L1377
ldrh w1, [x23]
cmp w1, w0
- bne .L1353
+ bne .L1377
mov w0, 0
bl List_get_gc_head_node
bl FtlGcRefreshBlock
-.L1353:
+.L1377:
mov w0, 128
mov w1, 1
strh w0, [x20]
@@ -10064,13 +10097,13 @@ FtlWrite:
bl rk_ftl_garbage_collect
ldrh w0, [x22, #:lo12:.LANCHOR48]
cmp w0, 2
- bhi .L1354
+ bhi .L1378
subs w19, w19, #1
- bne .L1355
- b .L1354
-.L1356:
+ bne .L1379
+ b .L1378
+.L1380:
mov w0, -1
- b .L1323
+ b .L1347
.size FtlWrite, .-FtlWrite
.section .text.sftl_gc,"ax",@progbits
.align 2
@@ -10112,10 +10145,10 @@ FtlLoadSysInfo:
ldrh w0, [x20, #:lo12:.LANCHOR139]
mov w1, 65535
cmp w0, w1
- bne .L1368
-.L1379:
+ bne .L1392
+.L1403:
mov w0, -1
-.L1367:
+.L1391:
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
ldp x23, x24, [sp, 48]
@@ -10123,7 +10156,7 @@ FtlLoadSysInfo:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 112
ret
-.L1368:
+.L1392:
add x24, x20, :lo12:.LANCHOR139
mov w1, 1
bl FtlGetLastWrittenPage
@@ -10135,28 +10168,28 @@ FtlLoadSysInfo:
ldrsh w24, [x20, #:lo12:.LANCHOR139]
add x26, x26, :lo12:.LANCHOR23
add x27, x27, :lo12:.LANCHOR178
-.L1370:
- tbz w28, #31, .L1376
+.L1394:
+ tbz w28, #31, .L1400
adrp x1, .LANCHOR178
adrp x0, .LC1
mov w2, 1465
add x1, x1, :lo12:.LANCHOR178
add x0, x0, :lo12:.LC1
bl printf
-.L1375:
+.L1399:
adrp x1, .LANCHOR23
ldrh w0, [x21, #:lo12:.LANCHOR5]
ldrh w1, [x1, #:lo12:.LANCHOR23]
add x0, x0, 24
cmp x1, x0, lsl 1
- bcs .L1378
+ bcs .L1402
adrp x1, .LANCHOR178
adrp x0, .LC1
mov w2, 1467
add x1, x1, :lo12:.LANCHOR178
add x0, x0, :lo12:.LC1
bl printf
-.L1378:
+.L1402:
add x24, x19, :lo12:.LANCHOR138
adrp x19, .LANCHOR39
add x22, x19, :lo12:.LANCHOR39
@@ -10185,7 +10218,7 @@ FtlLoadSysInfo:
mov w0, 19539
movk w0, 0x4654, lsl 16
cmp w1, w0
- bne .L1379
+ bne .L1403
add x20, x20, :lo12:.LANCHOR139
adrp x0, .LANCHOR10
ldrh w1, [x22, 8]
@@ -10193,7 +10226,7 @@ FtlLoadSysInfo:
ldrh w0, [x0, #:lo12:.LANCHOR10]
strh w1, [x20, 6]
cmp w2, w0
- bne .L1379
+ bne .L1403
adrp x0, .LANCHOR179
adrp x2, .LANCHOR152
adrp x3, .LANCHOR3
@@ -10218,18 +10251,18 @@ FtlLoadSysInfo:
udiv w0, w0, w3
adrp x3, .LANCHOR171
strh w0, [x3, #:lo12:.LANCHOR171]
- bls .L1380
+ bls .L1404
adrp x1, .LANCHOR178
adrp x0, .LC1
mov w2, 1489
add x1, x1, :lo12:.LANCHOR178
add x0, x0, :lo12:.LC1
bl printf
-.L1380:
+.L1404:
add x4, x19, :lo12:.LANCHOR39
adrp x0, .LANCHOR51
add x2, x0, :lo12:.LANCHOR51
- adrp x5, .LANCHOR144
+ adrp x5, .LANCHOR145
adrp x20, .LANCHOR52
mov x22, x5
ldrh w1, [x4, 16]
@@ -10240,10 +10273,10 @@ FtlLoadSysInfo:
strb w1, [x2, 6]
ldrb w1, [x4, 11]
strb w1, [x2, 8]
- add x1, x5, :lo12:.LANCHOR144
+ add x1, x5, :lo12:.LANCHOR145
strh w3, [x2, 2]
mov w2, -1
- strh w2, [x5, #:lo12:.LANCHOR144]
+ strh w2, [x5, #:lo12:.LANCHOR145]
add x2, x20, :lo12:.LANCHOR52
strh wzr, [x1, 2]
strb wzr, [x1, 6]
@@ -10290,47 +10323,47 @@ FtlLoadSysInfo:
adrp x1, .LANCHOR82
ldr w4, [x1, #:lo12:.LANCHOR82]
cmp w3, w4
- bls .L1381
+ bls .L1405
str w3, [x1, #:lo12:.LANCHOR82]
-.L1381:
+.L1405:
add x19, x19, :lo12:.LANCHOR39
adrp x1, .LANCHOR83
ldr w3, [x1, #:lo12:.LANCHOR83]
ldr w2, [x19, 36]
cmp w2, w3
- bls .L1382
+ bls .L1406
str w2, [x1, #:lo12:.LANCHOR83]
-.L1382:
+.L1406:
mov w1, 65535
cmp w6, w1
- beq .L1383
+ beq .L1407
add x0, x0, :lo12:.LANCHOR51
bl make_superblock
-.L1383:
+.L1407:
ldrh w2, [x20, #:lo12:.LANCHOR52]
mov w1, 65535
add x0, x20, :lo12:.LANCHOR52
cmp w2, w1
- beq .L1384
+ beq .L1408
bl make_superblock
-.L1384:
+.L1408:
ldrh w2, [x21, #:lo12:.LANCHOR53]
mov w1, 65535
add x0, x21, :lo12:.LANCHOR53
cmp w2, w1
- beq .L1385
+ beq .L1409
bl make_superblock
-.L1385:
- ldrh w2, [x22, #:lo12:.LANCHOR144]
+.L1409:
+ ldrh w2, [x22, #:lo12:.LANCHOR145]
mov w1, 65535
- add x0, x22, :lo12:.LANCHOR144
+ add x0, x22, :lo12:.LANCHOR145
cmp w2, w1
- beq .L1386
+ beq .L1410
bl make_superblock
-.L1386:
+.L1410:
mov w0, 0
- b .L1367
-.L1376:
+ b .L1391
+.L1400:
add x3, x19, :lo12:.LANCHOR138
orr w0, w28, w24, lsl 10
mov w2, 1
@@ -10344,56 +10377,59 @@ FtlLoadSysInfo:
ldr x3, [x29, 104]
ldr x0, [x3, 16]
ldr w8, [x0, 12]
- cbz w8, .L1371
+ cbz w8, .L1395
+ ldr w0, [x19, #:lo12:.LANCHOR138]
+ cmn w0, #1
+ beq .L1395
ldrh w1, [x26]
ldr x0, [x3, 8]
bl js_hash
cmp w8, w0
- beq .L1371
+ beq .L1395
add x10, x20, :lo12:.LANCHOR139
mov w6, w0
mov w5, w8
- adrp x0, .LC38
+ adrp x0, .LC46
mov w3, w28
mov w2, w24
ldrh w4, [x10, 4]
mov x1, x27
- add x0, x0, :lo12:.LC38
+ add x0, x0, :lo12:.LC46
str x10, [x29, 104]
bl printf
- cbnz w28, .L1372
+ cbnz w28, .L1396
ldr x10, [x29, 104]
ldrh w0, [x10, 4]
cmp w24, w0
- beq .L1372
+ beq .L1396
sxth w24, w0
adrp x0, .LANCHOR20
ldrh w7, [x0, #:lo12:.LANCHOR20]
sub w7, w7, #1
-.L1395:
+.L1422:
sxth w28, w7
- b .L1370
-.L1372:
+ b .L1394
+.L1396:
mov w0, -1
str w0, [x19, #:lo12:.LANCHOR138]
-.L1371:
+.L1395:
ldr w0, [x19, #:lo12:.LANCHOR138]
cmn w0, #1
- beq .L1374
+ beq .L1398
ldr x0, [x22, #:lo12:.LANCHOR106]
mov w1, 19539
movk w1, 0x4654, lsl 16
ldr w0, [x0]
cmp w0, w1
- bne .L1374
+ bne .L1398
ldr x0, [x25, #:lo12:.LANCHOR114]
ldrh w1, [x0]
mov w0, 61604
cmp w1, w0
- beq .L1375
-.L1374:
+ beq .L1399
+.L1398:
sub w7, w28, #1
- b .L1395
+ b .L1422
.size FtlLoadSysInfo, .-FtlLoadSysInfo
.section .text.FtlMapTblRecovery,"ax",@progbits
.align 2
@@ -10442,21 +10478,21 @@ FtlMapTblRecovery:
add x0, x26, :lo12:.LANCHOR20
str w1, [x19, 56]
str x0, [x29, 96]
-.L1397:
+.L1424:
ldr w0, [x29, 152]
cmp w20, w0
- bge .L1416
+ bge .L1443
ldr w0, [x29, 108]
sxtw x28, w20
cmp w20, w0
- bne .L1398
+ bne .L1425
lsl x0, x28, 1
mov w1, 1
add x26, x24, x0
adrp x27, .LANCHOR23
add x27, x27, :lo12:.LANCHOR23
- mov w22, 0
ldrh w0, [x24, x0]
+ mov w24, 0
bl FtlGetLastWrittenPage
sxth w1, w0
add w0, w0, 1
@@ -10469,22 +10505,22 @@ FtlMapTblRecovery:
str w0, [x19, 48]
add x28, x28, :lo12:.LANCHOR180
ldr x0, [x29, 128]
- add x24, x0, :lo12:.LANCHOR138
-.L1399:
+ add x22, x0, :lo12:.LANCHOR138
+.L1426:
ldr w0, [x29, 152]
- cmp w22, w0
- ble .L1402
-.L1416:
+ cmp w24, w0
+ ble .L1429
+.L1443:
mov x0, x19
bl ftl_free_no_use_map_blk
adrp x0, .LANCHOR20
ldrh w1, [x19, 2]
ldrh w0, [x0, #:lo12:.LANCHOR20]
cmp w1, w0
- bne .L1404
+ bne .L1431
mov x0, x19
bl ftl_map_blk_alloc_new_blk
-.L1404:
+.L1431:
mov x0, x19
bl ftl_map_blk_gc
mov x0, x19
@@ -10497,54 +10533,57 @@ FtlMapTblRecovery:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 160
ret
-.L1402:
+.L1429:
ldrh w0, [x26]
mov w2, 1
mov w1, w2
- orr w0, w22, w0, lsl 10
- str w0, [x24, 4]
- mov x0, x24
+ orr w0, w24, w0, lsl 10
+ str w0, [x22, 4]
+ mov x0, x22
bl FlashReadPages
- ldr x0, [x24, 16]
+ ldr x0, [x22, 16]
ldr w0, [x0, 12]
str w0, [x29, 156]
uxtw x0, w0
- cbz w0, .L1400
+ cbz w0, .L1427
+ ldr w0, [x22]
+ cmn w0, #1
+ beq .L1427
ldrh w1, [x27]
- ldr x0, [x24, 8]
+ ldr x0, [x22, 8]
bl js_hash
ldr w1, [x29, 156]
cmp w1, w0
- beq .L1400
+ beq .L1427
mov w5, w0
mov x4, x1
- mov w3, w22
+ mov w3, w24
mov w2, w20
mov x1, x28
- adrp x0, .LC39
- add x0, x0, :lo12:.LC39
+ adrp x0, .LC47
+ add x0, x0, :lo12:.LC47
bl printf
mov w0, -1
- str w0, [x24]
-.L1400:
- ldr w0, [x24]
+ str w0, [x22]
+.L1427:
+ ldr w0, [x22]
cmn w0, #1
- beq .L1401
+ beq .L1428
ldrh w0, [x21, 8]
cmp w25, w0
- bls .L1401
+ bls .L1428
ldrh w2, [x21]
ldrh w1, [x19, 4]
cmp w2, w1
- bne .L1401
+ bne .L1428
ubfiz x0, x0, 2, 16
- ldr w1, [x24, 4]
+ ldr w1, [x22, 4]
str w1, [x23, x0]
-.L1401:
- add w22, w22, 1
- sxth w22, w22
- b .L1399
-.L1398:
+.L1428:
+ add w6, w24, 1
+ sxth w24, w6
+ b .L1426
+.L1425:
lsl x2, x28, 1
ldr x0, [x22, #:lo12:.LANCHOR106]
str x0, [x27, 8]
@@ -10561,16 +10600,16 @@ FtlMapTblRecovery:
bl FlashReadPages
ldr w0, [x27]
cmn w0, #1
- beq .L1418
+ beq .L1445
ldrh w1, [x21]
ldrh w0, [x19, 4]
cmp w1, w0
- bne .L1418
+ bne .L1445
ldrh w1, [x21, 8]
mov w0, 64245
cmp w1, w0
- beq .L1406
-.L1418:
+ beq .L1433
+.L1445:
adrp x0, .LANCHOR23
add x0, x0, :lo12:.LANCHOR23
mov w28, 0
@@ -10578,11 +10617,11 @@ FtlMapTblRecovery:
adrp x0, .LANCHOR180
add x0, x0, :lo12:.LANCHOR180
str x0, [x29, 112]
-.L1407:
+.L1434:
ldr x0, [x29, 96]
ldrh w0, [x0]
cmp w28, w0
- bge .L1414
+ bge .L1441
ldr x0, [x29, 136]
mov w2, 1
mov w1, w2
@@ -10595,69 +10634,72 @@ FtlMapTblRecovery:
ldr w0, [x0, 12]
str w0, [x29, 156]
uxtw x0, w0
- cbz w0, .L1411
+ cbz w0, .L1438
+ ldr w0, [x27]
+ cmn w0, #1
+ beq .L1438
ldr x0, [x29, 120]
ldrh w1, [x0]
ldr x0, [x27, 8]
bl js_hash
ldr w1, [x29, 156]
cmp w1, w0
- beq .L1411
+ beq .L1438
mov x4, x1
ldr x1, [x29, 112]
mov w5, w0
mov w3, w28
mov w2, w20
- adrp x0, .LC40
- add x0, x0, :lo12:.LC40
+ adrp x0, .LC48
+ add x0, x0, :lo12:.LC48
bl printf
mov w0, -1
str w0, [x27]
-.L1411:
+.L1438:
ldr w0, [x27]
cmn w0, #1
- beq .L1412
+ beq .L1439
ldrh w0, [x21, 8]
cmp w25, w0
- bls .L1412
+ bls .L1439
ldrh w2, [x21]
ldrh w1, [x19, 4]
cmp w2, w1
- bne .L1412
+ bne .L1439
ubfiz x0, x0, 2, 16
ldr w1, [x27, 4]
str w1, [x23, x0]
-.L1412:
+.L1439:
add w7, w28, 1
sxth w28, w7
- b .L1407
-.L1406:
+ b .L1434
+.L1433:
ldrh w3, [x26, #:lo12:.LANCHOR20]
mov w0, 0
ldr x4, [x22, #:lo12:.LANCHOR106]
sub w3, w3, #1
-.L1408:
+.L1435:
cmp w0, w3
- blt .L1410
-.L1414:
+ blt .L1437
+.L1441:
add w20, w20, 1
sxth w20, w20
- b .L1397
-.L1410:
+ b .L1424
+.L1437:
lsl w2, w0, 1
sxtw x2, w2
lsl x1, x2, 2
ldrh w1, [x4, x1]
cmp w25, w1
- bls .L1409
+ bls .L1436
add x2, x2, 1
ubfiz x1, x1, 2, 16
ldr w2, [x4, x2, lsl 2]
str w2, [x23, x1]
-.L1409:
+.L1436:
add w0, w0, 1
sxth w0, w0
- b .L1408
+ b .L1435
.size FtlMapTblRecovery, .-FtlMapTblRecovery
.section .text.FtlLoadVonderInfo,"ax",@progbits
.align 2
@@ -10731,20 +10773,20 @@ FtlSysBlkInit:
ldrh w1, [x0, #:lo12:.LANCHOR139]
mov w0, 65535
cmp w1, w0
- bne .L1437
-.L1439:
+ bne .L1470
+.L1472:
mov w21, -1
-.L1436:
+.L1469:
mov w0, w21
ldr x23, [sp, 48]
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
ldp x29, x30, [sp], 64
ret
-.L1437:
+.L1470:
bl FtlLoadSysInfo
mov w21, w0
- cbnz w0, .L1439
+ cbnz w0, .L1472
bl FtlLoadMapInfo
bl FtlLoadVonderInfo
bl Ftl_load_ext_data
@@ -10760,19 +10802,19 @@ FtlSysBlkInit:
ldr x1, [x0, #:lo12:.LANCHOR55]
mov w0, 0
add x1, x1, 4
-.L1440:
+.L1473:
cmp w0, w2
- bge .L1445
+ bge .L1478
ldr w3, [x1], 16
- tbz w3, #31, .L1441
-.L1445:
+ tbz w3, #31, .L1474
+.L1478:
adrp x3, .LANCHOR83
cmp w0, w2
ldr w1, [x3, #:lo12:.LANCHOR83]
add w1, w1, 32
str w1, [x3, #:lo12:.LANCHOR83]
- bge .L1447
-.L1442:
+ bge .L1480
+.L1475:
adrp x23, .LANCHOR51
add x20, x23, :lo12:.LANCHOR51
mov x0, x20
@@ -10811,17 +10853,17 @@ FtlSysBlkInit:
strh w1, [x0, 30]
bl l2p_flush
bl FtlVpcTblFlush
-.L1449:
+.L1482:
bl FtlVpcTblFlush
- b .L1436
-.L1441:
+ b .L1469
+.L1474:
add w0, w0, 1
- b .L1440
-.L1447:
+ b .L1473
+.L1480:
ldrh w0, [x19, #:lo12:.LANCHOR156]
- cbnz w0, .L1442
+ cbnz w0, .L1475
bl l2p_flush
- b .L1449
+ b .L1482
.size FtlSysBlkInit, .-FtlSysBlkInit
.section .text.ftl_low_format,"ax",@progbits
.align 2
@@ -10834,17 +10876,19 @@ ftl_low_format:
stp x23, x24, [sp, 48]
adrp x24, .LANCHOR4
str wzr, [x0, #:lo12:.LANCHOR83]
- ldrh w0, [x24, #:lo12:.LANCHOR4]
+ adrp x0, .LANCHOR143
stp x19, x20, [sp, 16]
adrp x20, .LANCHOR82
+ str wzr, [x0, #:lo12:.LANCHOR143]
+ ldrh w0, [x24, #:lo12:.LANCHOR4]
stp x21, x22, [sp, 32]
stp x25, x26, [sp, 64]
str wzr, [x20, #:lo12:.LANCHOR82]
bl FtlFreeSysBlkQueueInit
bl FtlLoadBbt
- cbz w0, .L1451
+ cbz w0, .L1484
bl FtlMakeBbt
-.L1451:
+.L1484:
adrp x23, .LANCHOR12
adrp x0, .LANCHOR109
mov w6, 23752
@@ -10855,31 +10899,31 @@ ftl_low_format:
lsl w1, w1, 7
ldr x5, [x0, #:lo12:.LANCHOR110]
mov w0, 0
-.L1452:
+.L1485:
cmp w0, w1
- blt .L1453
+ blt .L1486
adrp x21, .LANCHOR5
adrp x22, .LANCHOR6
add x26, x22, :lo12:.LANCHOR6
mov w19, 0
ldrh w25, [x21, #:lo12:.LANCHOR5]
-.L1454:
+.L1487:
ldrh w0, [x26]
cmp w0, w25
- bhi .L1455
+ bhi .L1488
adrp x25, .LANCHOR3
sub w1, w19, #2
ldrh w0, [x25, #:lo12:.LANCHOR3]
cmp w1, w0, lsl 1
- bgt .L1456
-.L1460:
+ bgt .L1489
+.L1493:
add x26, x21, :lo12:.LANCHOR5
mov w19, 0
mov w24, 0
-.L1457:
+.L1490:
ldrh w0, [x26]
cmp w0, w24
- bhi .L1461
+ bhi .L1494
adrp x0, .LANCHOR99
ldrh w1, [x22, #:lo12:.LANCHOR6]
ldrh w4, [x25, #:lo12:.LANCHOR3]
@@ -10896,28 +10940,28 @@ ftl_low_format:
mov w6, 24
mul w6, w4, w6
cmp w19, w6
- ble .L1462
+ ble .L1495
sub w1, w1, w19
udiv w1, w1, w4
str w1, [x3, #:lo12:.LANCHOR152]
lsr w1, w1, 5
add w1, w1, 24
strh w1, [x2, #:lo12:.LANCHOR171]
-.L1462:
+.L1495:
adrp x1, .LANCHOR15
ldrh w1, [x1, #:lo12:.LANCHOR15]
- cbz w1, .L1464
+ cbz w1, .L1497
ldrh w6, [x2, #:lo12:.LANCHOR171]
add w6, w6, w1, lsr 1
strh w6, [x2, #:lo12:.LANCHOR171]
mul w6, w1, w4
cmp w19, w6
- bge .L1464
+ bge .L1497
add w1, w1, 32
str w5, [x3, #:lo12:.LANCHOR152]
add w1, w0, w1
strh w1, [x2, #:lo12:.LANCHOR171]
-.L1464:
+.L1497:
ldrh w1, [x2, #:lo12:.LANCHOR171]
adrp x25, .LANCHOR179
ldr w0, [x3, #:lo12:.LANCHOR152]
@@ -10941,11 +10985,11 @@ ftl_low_format:
lsl w2, w2, 1
bl ftl_memset
adrp x0, .LANCHOR59
- adrp x1, .LANCHOR144
+ adrp x1, .LANCHOR145
ldrh w2, [x21, #:lo12:.LANCHOR5]
str wzr, [x0, #:lo12:.LANCHOR59]
- add x0, x1, :lo12:.LANCHOR144
- strh w23, [x1, #:lo12:.LANCHOR144]
+ add x0, x1, :lo12:.LANCHOR145
+ strh w23, [x1, #:lo12:.LANCHOR145]
mov w1, 255
lsr w2, w2, 3
strh wzr, [x0, 2]
@@ -10961,20 +11005,20 @@ ftl_low_format:
ldr x0, [x0, #:lo12:.LANCHOR1]
strb wzr, [x19, 6]
bl ftl_memset
-.L1466:
+.L1499:
mov x0, x19
bl make_superblock
ldrb w1, [x19, 7]
ldrh w0, [x19]
- cbnz w1, .L1467
+ cbnz w1, .L1500
ldr x1, [x24, #:lo12:.LANCHOR42]
ubfiz x0, x0, 1, 16
strh w23, [x1, x0]
ldrh w0, [x19]
add w0, w0, 1
strh w0, [x19]
- b .L1466
-.L1453:
+ b .L1499
+.L1486:
ubfiz x3, x0, 2, 16
mvn w2, w0
orr w2, w0, w2, lsl 16
@@ -10982,8 +11026,8 @@ ftl_low_format:
and w0, w0, 65535
str w2, [x4, x3]
str w6, [x5, x3]
- b .L1452
-.L1455:
+ b .L1485
+.L1488:
mov w0, w25
mov w1, 1
add w25, w25, 1
@@ -10991,8 +11035,8 @@ ftl_low_format:
add w19, w19, w0
and w25, w25, 65535
and w19, w19, 65535
- b .L1454
-.L1456:
+ b .L1487
+.L1489:
udiv w0, w19, w0
adrp x1, .LANCHOR31
ldr w19, [x1, #:lo12:.LANCHOR31]
@@ -11002,17 +11046,17 @@ ftl_low_format:
add x24, x22, :lo12:.LANCHOR6
bl FtlFreeSysBlkQueueInit
ldrh w19, [x21, #:lo12:.LANCHOR5]
-.L1458:
+.L1491:
ldrh w0, [x24]
cmp w0, w19
- bls .L1460
+ bls .L1493
mov w0, w19
add w19, w19, 1
mov w1, 1
and w19, w19, 65535
bl FtlLowFormatEraseBlock
- b .L1458
-.L1461:
+ b .L1491
+.L1494:
mov w0, w24
mov w1, 0
add w24, w24, 1
@@ -11020,8 +11064,8 @@ ftl_low_format:
add w19, w19, w0
and w24, w24, 65535
and w19, w19, 65535
- b .L1457
-.L1467:
+ b .L1490
+.L1500:
ldr w1, [x20, #:lo12:.LANCHOR82]
ubfiz x0, x0, 1, 16
str w1, [x19, 12]
@@ -11041,20 +11085,20 @@ ftl_low_format:
mov w1, 1
strb wzr, [x0, 6]
strb w1, [x0, 8]
-.L1468:
+.L1501:
mov x0, x19
bl make_superblock
ldrb w1, [x19, 7]
ldrh w0, [x19]
- cbnz w1, .L1469
+ cbnz w1, .L1502
ldr x1, [x24, #:lo12:.LANCHOR42]
ubfiz x0, x0, 1, 16
strh w23, [x1, x0]
ldrh w0, [x19]
add w0, w0, 1
strh w0, [x19]
- b .L1468
-.L1469:
+ b .L1501
+.L1502:
ldr w1, [x20, #:lo12:.LANCHOR82]
ubfiz x0, x0, 1, 16
str w1, [x19, 12]
@@ -11080,11 +11124,11 @@ ftl_low_format:
str w0, [x20, #:lo12:.LANCHOR82]
bl FtlVpcTblFlush
bl FtlSysBlkInit
- cbnz w0, .L1470
+ cbnz w0, .L1503
adrp x0, .LANCHOR166
mov w1, 1
str w1, [x0, #:lo12:.LANCHOR166]
-.L1470:
+.L1503:
mov w0, 0
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
@@ -11099,8 +11143,8 @@ ftl_low_format:
.type sftl_init, %function
sftl_init:
stp x29, x30, [sp, -32]!
- adrp x1, .LC41
- add x1, x1, :lo12:.LC41
+ adrp x1, .LC49
+ add x1, x1, :lo12:.LC49
mov w0, -1
add x29, sp, 0
stp x19, x20, [sp, 16]
@@ -11108,8 +11152,8 @@ sftl_init:
adrp x19, .LANCHOR181
add x19, x19, :lo12:.LANCHOR181
str w0, [x20, #:lo12:.LANCHOR166]
- adrp x0, .LC34
- add x0, x0, :lo12:.LC34
+ adrp x0, .LC38
+ add x0, x0, :lo12:.LC38
bl printf
adrp x0, .LANCHOR0
add x0, x0, :lo12:.LANCHOR0
@@ -11119,34 +11163,21 @@ sftl_init:
adrp x0, .LANCHOR4
ldrh w0, [x0, #:lo12:.LANCHOR4]
bl FtlFreeSysBlkQueueInit
-.L1476:
+.L1509:
bl FtlLoadBbt
- cbz w0, .L1477
-.L1492:
+ cbz w0, .L1510
+.L1520:
ldr w0, [x19]
cmp w0, 1
- bne .L1476
+ bne .L1509
str wzr, [x19]
bl ftl_low_format
- b .L1476
-.L1477:
+ b .L1509
+.L1510:
bl FtlSysBlkInit
- cbnz w0, .L1492
- mov w0, 1
- str w0, [x20, #:lo12:.LANCHOR166]
- adrp x0, .LANCHOR48
- ldrh w0, [x0, #:lo12:.LANCHOR48]
- cmp w0, 15
- bhi .L1489
- mov w19, 8129
-.L1483:
+ cbnz w0, .L1520
mov w1, 1
- mov w0, 0
- bl rk_ftl_garbage_collect
- subs w19, w19, #1
- bne .L1483
-.L1489:
- mov w0, 0
+ str w1, [x20, #:lo12:.LANCHOR166]
ldp x19, x20, [sp, 16]
ldp x29, x30, [sp], 32
ret
@@ -11167,17 +11198,17 @@ FtlWriteToIDB:
stp x21, x22, [sp, 32]
adrp x24, .LANCHOR182
stp x27, x28, [sp, 80]
- bls .L1494
+ bls .L1522
mov w19, w0
cmp w0, 575
- bls .L1495
-.L1494:
+ bls .L1523
+.L1522:
ldr w0, [x24, #:lo12:.LANCHOR182]
- cbnz w0, .L1496
-.L1561:
+ cbnz w0, .L1524
+.L1589:
mov w19, 0
- b .L1493
-.L1496:
+ b .L1521
+.L1524:
adrp x0, .LANCHOR183
str x0, [x29, 120]
mov w1, 35899
@@ -11185,7 +11216,7 @@ FtlWriteToIDB:
movk w1, 0xfcdc, lsl 16
ldr w2, [x23]
cmp w2, w1
- bne .L1498
+ bne .L1526
adrp x21, .LANCHOR0
add x0, x21, :lo12:.LANCHOR0
mov w19, 65535
@@ -11194,9 +11225,9 @@ FtlWriteToIDB:
mov x0, 262140
add x2, x23, x0
mov w0, 0
-.L1502:
+.L1530:
ldr w4, [x2]
- cbnz w4, .L1499
+ cbnz w4, .L1527
ldr w4, [x23, w0, uxtw 2]
add w0, w0, 1
str w4, [x2], -4
@@ -11204,13 +11235,13 @@ FtlWriteToIDB:
sub w19, w19, #1
csel w0, w0, wzr, cc
cmp w19, 4096
- bne .L1502
+ bne .L1530
mov w19, 512
- b .L1501
-.L1499:
+ b .L1529
+.L1527:
add w19, w19, 127
lsr w19, w19, 7
-.L1501:
+.L1529:
add w0, w19, 4
ubfiz w1, w1, 2, 14
mov w22, 0
@@ -11221,7 +11252,7 @@ FtlWriteToIDB:
str w0, [x29, 136]
adrp x0, .LANCHOR78
add x20, x0, :lo12:.LANCHOR78
-.L1524:
+.L1552:
adrp x26, .LANCHOR184
mov w1, 0
mov x2, 512
@@ -11234,27 +11265,27 @@ FtlWriteToIDB:
add x0, x0, :lo12:.LANCHOR78
ldr x1, [x0, 32]
mul w25, w27, w22
- cbz x1, .L1532
+ cbz x1, .L1560
ldr x0, [x0, 40]
mov w26, 6
cmp x0, 0
mov w0, 9
csel w26, w26, w0, eq
-.L1503:
+.L1531:
ldr x2, [x20, 8]
mov w1, w25
mov w0, 0
blr x2
ldr w0, [x29, 156]
cmp w0, 1
- beq .L1504
+ beq .L1532
ldr x2, [x20, 8]
add w1, w27, w25
mov w0, 0
blr x2
-.L1504:
+.L1532:
cmp w26, 9
- bne .L1534
+ bne .L1562
ldr x0, [x29, 144]
mov w2, 1024
mov w1, 0
@@ -11279,7 +11310,7 @@ FtlWriteToIDB:
add x0, x28, 12
bl js_hash
str w0, [x28, 8]
-.L1505:
+.L1533:
ldr w0, [x29, 156]
mov x6, x23
mul w0, w0, w27
@@ -11287,22 +11318,22 @@ FtlWriteToIDB:
str w0, [x29, 140]
add w0, w25, 1
str w0, [x29, 132]
-.L1506:
+.L1534:
ldr w0, [x29, 140]
mov w1, w27
cmp w27, w0
- bcs .L1513
+ bcs .L1541
cmp w26, 9
- bne .L1507
+ bne .L1535
ldr w0, [x29, 132]
add w0, w0, w1
-.L1560:
+.L1588:
str w0, [x29, 160]
mov w0, 61424
str w0, [x29, 164]
cmp w1, 0
ccmp w26, 9, 0, eq
- bne .L1509
+ bne .L1537
ldr x1, [x20, 32]
mov w0, 70
str x6, [x29, 104]
@@ -11322,8 +11353,8 @@ FtlWriteToIDB:
ldr w1, [x29, 112]
ldr x6, [x29, 104]
cmn w1, #1
- bne .L1510
-.L1513:
+ bne .L1538
+.L1541:
ldr x0, [x29, 144]
ldr x26, [x0, #:lo12:.LANCHOR184]
add x0, x21, :lo12:.LANCHOR0
@@ -11332,21 +11363,21 @@ FtlWriteToIDB:
mul w1, w0, w22
str w1, [x29, 140]
ldr x1, [x20, 32]
- cbnz x1, .L1511
+ cbnz x1, .L1539
mov w25, 6
-.L1512:
+.L1540:
ldr w1, [x29, 156]
mov x27, 0
mul w0, w1, w0
str w0, [x29, 132]
-.L1515:
+.L1543:
ldr w0, [x29, 132]
mov w1, w27
cmp w27, w0
- bcs .L1519
+ bcs .L1547
cmp w27, 0
ccmp w25, 9, 0, eq
- bne .L1516
+ bne .L1544
ldr x1, [x20, 32]
mov w0, 70
blr x1
@@ -11370,34 +11401,34 @@ FtlWriteToIDB:
mov w1, 18766
movk w1, 0x464e, lsl 16
cmp w0, w1
- beq .L1517
-.L1519:
+ beq .L1545
+.L1547:
ldr x0, [x29, 144]
mov x2, x23
mov x1, 0
ldr x0, [x0, #:lo12:.LANCHOR184]
-.L1518:
+.L1546:
ldr w3, [x29, 136]
mov w26, w1
cmp w1, w3
- bcc .L1522
+ bcc .L1550
ldr w0, [x29, 152]
add w0, w0, 1
str w0, [x29, 152]
cmp w0, 5
- bls .L1521
- b .L1525
-.L1532:
+ bls .L1549
+ b .L1553
+.L1560:
mov w26, 6
- b .L1503
-.L1534:
+ b .L1531
+.L1562:
mov x28, 0
- b .L1505
-.L1507:
+ b .L1533
+.L1535:
add w0, w1, w25
lsl w0, w0, 2
- b .L1560
-.L1509:
+ b .L1588
+.L1537:
ldr x7, [x20, 16]
add x3, x29, 160
mov x2, x6
@@ -11406,20 +11437,20 @@ FtlWriteToIDB:
str x6, [x29, 112]
blr x7
cmn w0, #1
- beq .L1513
+ beq .L1541
ldr x6, [x29, 112]
add x6, x6, 2048
-.L1510:
+.L1538:
add x27, x27, 1
- b .L1506
-.L1511:
+ b .L1534
+.L1539:
ldr x1, [x20, 40]
mov w25, 6
cmp x1, 0
mov w1, 9
csel w25, w25, w1, eq
- b .L1512
-.L1516:
+ b .L1540
+.L1544:
ldr x6, [x20, 24]
add x3, x29, 160
ldr w0, [x29, 140]
@@ -11428,16 +11459,16 @@ FtlWriteToIDB:
mov w0, 0
blr x6
cmn w0, #1
- beq .L1519
+ beq .L1547
ldr w0, [x29, 164]
mov w1, 61424
cmp w0, w1
- bne .L1519
+ bne .L1547
add x26, x26, 2048
-.L1517:
+.L1545:
add x27, x27, 1
- b .L1515
-.L1522:
+ b .L1543
+.L1550:
mov x25, x2
ldr w4, [x0, x1, lsl 2]
lsl x27, x1, 2
@@ -11445,7 +11476,7 @@ FtlWriteToIDB:
add x1, x1, 1
ldr w3, [x25]
cmp w4, w3
- beq .L1518
+ beq .L1546
mov x2, 512
mov w1, 0
bl memset
@@ -11455,8 +11486,8 @@ FtlWriteToIDB:
mov w4, w26
ldr x0, [x0, #:lo12:.LANCHOR184]
ldr w2, [x0, x27]
- adrp x0, .LC42
- add x0, x0, :lo12:.LC42
+ adrp x0, .LC50
+ add x0, x0, :lo12:.LC50
bl printf
add x0, x21, :lo12:.LANCHOR0
ldr x2, [x20, 8]
@@ -11464,16 +11495,16 @@ FtlWriteToIDB:
mov w0, 0
mul w1, w1, w22
blr x2
-.L1521:
+.L1549:
ldr w0, [x29, 156]
add w22, w22, w0
cmp w22, 15
- bls .L1524
+ bls .L1552
ldr w0, [x29, 152]
- cbnz w0, .L1525
-.L1498:
+ cbnz w0, .L1553
+.L1526:
mov w19, -1
-.L1525:
+.L1553:
ldr x0, [x29, 120]
str wzr, [x24, #:lo12:.LANCHOR182]
ldr x0, [x0, #:lo12:.LANCHOR183]
@@ -11481,7 +11512,7 @@ FtlWriteToIDB:
adrp x0, .LANCHOR184
ldr x0, [x0, #:lo12:.LANCHOR184]
bl free
-.L1493:
+.L1521:
mov w0, w19
ldp x19, x20, [sp, 16]
ldp x21, x22, [sp, 32]
@@ -11490,11 +11521,11 @@ FtlWriteToIDB:
ldp x27, x28, [sp, 80]
ldp x29, x30, [sp], 224
ret
-.L1495:
+.L1523:
mov w21, w1
mov x22, x2
cmp w0, 64
- bne .L1526
+ bne .L1554
adrp x20, .LANCHOR183
mov w0, 262144
bl ftl_malloc
@@ -11505,55 +11536,55 @@ FtlWriteToIDB:
adrp x0, .LANCHOR184
str x1, [x0, #:lo12:.LANCHOR184]
ldr x0, [x20, #:lo12:.LANCHOR183]
- cbz x0, .L1527
- cbz x1, .L1527
+ cbz x0, .L1555
+ cbz x1, .L1555
mov w1, 1
mov w2, 262144
str w1, [x24, #:lo12:.LANCHOR182]
mov w1, 0
bl ftl_memset
-.L1526:
+.L1554:
ldr w0, [x24, #:lo12:.LANCHOR182]
- cbz w0, .L1561
+ cbz w0, .L1589
adrp x0, .LANCHOR183
cmp w19, 63
ldr x1, [x0, #:lo12:.LANCHOR183]
- bhi .L1529
+ bhi .L1557
mov w0, 64
sub w19, w0, w19
sub w21, w21, w19
ubfiz x19, x19, 9, 25
add x22, x22, x19
mov x20, x1
-.L1530:
+.L1558:
cmp w25, 575
- bls .L1531
+ bls .L1559
sub w21, w21, w23
sub w21, w21, #446
-.L1531:
+.L1559:
mov w4, w21
mov x3, x20
mov w2, 262144
- adrp x0, .LC44
- add x0, x0, :lo12:.LC44
+ adrp x0, .LC52
+ add x0, x0, :lo12:.LC52
bl printf
lsl w2, w21, 9
mov x1, x22
mov x0, x20
bl ftl_memcpy
- b .L1561
-.L1527:
+ b .L1589
+.L1555:
adrp x1, .LANCHOR185
- adrp x0, .LC43
+ adrp x0, .LC51
add x1, x1, :lo12:.LANCHOR185
- add x0, x0, :lo12:.LC43
+ add x0, x0, :lo12:.LC51
bl printf
- b .L1526
-.L1529:
+ b .L1554
+.L1557:
lsl w20, w19, 7
sub w20, w20, #8192
add x20, x1, x20, lsl 2
- b .L1530
+ b .L1558
.size FtlWriteToIDB, .-FtlWriteToIDB
.section .text.sftl_write,"ax",@progbits
.align 2
@@ -12218,7 +12249,7 @@ g_gc_skip_write_count:
.zero 4
.section .bss.g_gc_superblock,"aw",@nobits
.align 3
- .set .LANCHOR144,. + 0
+ .set .LANCHOR145,. + 0
.type g_gc_superblock, %object
.size g_gc_superblock, 48
g_gc_superblock:
@@ -12281,7 +12312,7 @@ g_nand_phy_info:
.zero 24
.section .bss.g_num_data_superblocks,"aw",@nobits
.align 1
- .set .LANCHOR45,. + 0
+ .set .LANCHOR44,. + 0
.type g_num_data_superblocks, %object
.size g_num_data_superblocks, 2
g_num_data_superblocks:
@@ -12344,7 +12375,7 @@ g_tmp_data_superblock_id:
.zero 2
.section .bss.g_totle_avg_erase_count,"aw",@nobits
.align 2
- .set .LANCHOR145,. + 0
+ .set .LANCHOR143,. + 0
.type g_totle_avg_erase_count, %object
.size g_totle_avg_erase_count, 4
g_totle_avg_erase_count:
@@ -12532,21 +12563,21 @@ p_data_block_list_table:
.zero 8
.section .bss.p_data_block_list_tail,"aw",@nobits
.align 3
- .set .LANCHOR44,. + 0
+ .set .LANCHOR43,. + 0
.type p_data_block_list_tail, %object
.size p_data_block_list_tail, 8
p_data_block_list_tail:
.zero 8
.section .bss.p_erase_count_table,"aw",@nobits
.align 3
- .set .LANCHOR43,. + 0
+ .set .LANCHOR47,. + 0
.type p_erase_count_table, %object
.size p_erase_count_table, 8
p_erase_count_table:
.zero 8
.section .bss.p_free_data_block_list_head,"aw",@nobits
.align 3
- .set .LANCHOR47,. + 0
+ .set .LANCHOR46,. + 0
.type p_free_data_block_list_head, %object
.size p_free_data_block_list_head, 8
p_free_data_block_list_head:
@@ -12816,345 +12847,363 @@ power_up_flag:
.LC8:
.string "not free: w: s:"
.section .rodata.FlashProgPages.str1.1,"aMS",@progbits,1
-.LC11:
+.LC14:
.string "prog read error: = %x\n"
-.LC12:
+.LC15:
+ .string "prog read REFRESH: = %x\n"
+.LC16:
.string "prog read s error: = %x %x %x\n"
-.LC13:
+.LC17:
.string "prog read d error: = %x %x %x\n"
+ .section .rodata.FlashReadPages.str1.1,"aMS",@progbits,1
+.LC11:
+ .string "FlashReadPages %x %x error_ecc_bits %d\n"
+.LC12:
+ .string "data:"
+.LC13:
+ .string "spare:"
.section .rodata.FtlBbmMapBadBlock.str1.1,"aMS",@progbits,1
.LC0:
.string "phyBlk = 0x%x die = %d block_in_die = 0x%x 0x%8x\n"
.section .rodata.FtlBbmTblFlush.str1.1,"aMS",@progbits,1
-.LC14:
+.LC18:
.string "FtlBbmTblFlush id=%x,page=%x,previd=%x cnt=%d\n"
-.LC15:
+.LC19:
.string "FtlBbmTblFlush error:%x\n"
-.LC16:
+.LC20:
.string "FtlBbmTblFlush error = %x error count = %d\n"
.section .rodata.FtlFreeSysBlkQueueOut.str1.1,"aMS",@progbits,1
.LC9:
.string "FtlFreeSysBlkQueueOut = %x, free count = %d, error\n"
.section .rodata.FtlGcScanTempBlk.str1.1,"aMS",@progbits,1
-.LC31:
+.LC35:
.string "FtlGcScanTempBlk Error ID %x %x!!!!!!! \n"
.section .rodata.FtlLoadEctTbl.str1.1,"aMS",@progbits,1
-.LC33:
+.LC37:
.string "no ect"
-.LC34:
+.LC38:
.string "%s\n"
.section .rodata.FtlLoadSysInfo.str1.1,"aMS",@progbits,1
-.LC38:
+.LC46:
.string "%s hash error this.id =%x page =%x pre_id =%x hash =%x hash_r =%x\n"
.section .rodata.FtlMapTblRecovery.str1.1,"aMS",@progbits,1
-.LC39:
+.LC47:
.string "%s last blk_id =%x page =%x hash error hash =%x hash_r =%x\n"
-.LC40:
+.LC48:
.string "%s scan blk_id =%x page =%x hash error hash =%x hash_r =%x\n"
.section .rodata.FtlMapWritePage.str1.1,"aMS",@progbits,1
-.LC18:
+.LC22:
.string "FtlMapWritePage error = %x \n"
-.LC19:
+.LC23:
.string "FtlMapWritePage error = %x error count = %d\n"
.section .rodata.FtlProgPages.str1.1,"aMS",@progbits,1
-.LC36:
+.LC40:
+ .string "FtlProgPages error %x = %d\n"
+.LC41:
.string "Ftlwrite decrement_vpc_count %x = %d\n"
.section .rodata.FtlRecoverySuperblock.str1.1,"aMS",@progbits,1
-.LC24:
+.LC27:
+ .string "data prev_ppa = %x error...................\n"
+.LC28:
.string "spuer block %x vpn is 0\n "
.section .rodata.FtlVendorPartRead.str1.1,"aMS",@progbits,1
-.LC32:
+.LC36:
.string "FtlVendorPartRead refresh = %x phyAddr = %x\n"
.section .rodata.FtlVpcTblFlush.str1.1,"aMS",@progbits,1
-.LC35:
+.LC39:
.string "FtlVpcTblFlush error = %x error count = %d\n"
.section .rodata.FtlWrite.str1.1,"aMS",@progbits,1
-.LC37:
+.LC44:
+ .string "FtlWrite: ecc error:%x %x %x\n"
+.LC45:
.string "FtlWrite: lpa error:%x %x\n"
.section .rodata.FtlWriteToIDB.str1.1,"aMS",@progbits,1
-.LC42:
+.LC50:
.string "write_idblock fail! %x %x %x %x\n"
-.LC43:
+.LC51:
.string "%s idb buffer alloc fail\n"
-.LC44:
+.LC52:
.string "%p %x %p %x\n"
.section .rodata.INSERT_DATA_LIST.str1.1,"aMS",@progbits,1
.LC1:
.string "\n!!!!! error @ func:%s - line:%d\n"
- .section .rodata.__func__.6241,"a",@progbits
+ .section .rodata.__func__.6243,"a",@progbits
.align 3
.set .LANCHOR169,. + 0
- .type __func__.6241, %object
- .size __func__.6241, 13
-__func__.6241:
+ .type __func__.6243, %object
+ .size __func__.6243, 13
+__func__.6243:
.string "FtlProgPages"
- .section .rodata.__func__.6269,"a",@progbits
+ .section .rodata.__func__.6271,"a",@progbits
.align 3
.set .LANCHOR177,. + 0
- .type __func__.6269, %object
- .size __func__.6269, 9
-__func__.6269:
+ .type __func__.6271, %object
+ .size __func__.6271, 9
+__func__.6271:
.string "FtlWrite"
- .section .rodata.__func__.6344,"a",@progbits
+ .section .rodata.__func__.6346,"a",@progbits
.align 3
.set .LANCHOR128,. + 0
- .type __func__.6344, %object
- .size __func__.6344, 14
-__func__.6344:
+ .type __func__.6346, %object
+ .size __func__.6346, 14
+__func__.6346:
.string "FtlBbt2Bitmap"
- .section .rodata.__func__.6379,"a",@progbits
+ .section .rodata.__func__.6381,"a",@progbits
.align 3
.set .LANCHOR141,. + 0
- .type __func__.6379, %object
- .size __func__.6379, 11
-__func__.6379:
+ .type __func__.6381, %object
+ .size __func__.6381, 11
+__func__.6381:
.string "FtlLoadBbt"
- .section .rodata.__func__.6494,"a",@progbits
+ .section .rodata.__func__.6496,"a",@progbits
.align 3
.set .LANCHOR49,. + 0
- .type __func__.6494, %object
- .size __func__.6494, 17
-__func__.6494:
+ .type __func__.6496, %object
+ .size __func__.6496, 17
+__func__.6496:
.string "INSERT_FREE_LIST"
- .section .rodata.__func__.6499,"a",@progbits
+ .section .rodata.__func__.6501,"a",@progbits
.align 3
- .set .LANCHOR46,. + 0
- .type __func__.6499, %object
- .size __func__.6499, 17
-__func__.6499:
+ .set .LANCHOR45,. + 0
+ .type __func__.6501, %object
+ .size __func__.6501, 17
+__func__.6501:
.string "INSERT_DATA_LIST"
- .section .rodata.__func__.6530,"a",@progbits
+ .section .rodata.__func__.6532,"a",@progbits
.align 3
.set .LANCHOR50,. + 0
- .type __func__.6530, %object
- .size __func__.6530, 17
-__func__.6530:
+ .type __func__.6532, %object
+ .size __func__.6532, 17
+__func__.6532:
.string "List_remove_node"
- .section .rodata.__func__.6562,"a",@progbits
+ .section .rodata.__func__.6564,"a",@progbits
.align 3
.set .LANCHOR54,. + 0
- .type __func__.6562, %object
- .size __func__.6562, 22
-__func__.6562:
+ .type __func__.6564, %object
+ .size __func__.6564, 22
+__func__.6564:
.string "List_update_data_list"
- .section .rodata.__func__.6571,"a",@progbits
+ .section .rodata.__func__.6573,"a",@progbits
.align 3
.set .LANCHOR150,. + 0
- .type __func__.6571, %object
- .size __func__.6571, 16
-__func__.6571:
+ .type __func__.6573, %object
+ .size __func__.6573, 16
+__func__.6573:
.string "load_l2p_region"
- .section .rodata.__func__.6604,"a",@progbits
+ .section .rodata.__func__.6606,"a",@progbits
.align 3
.set .LANCHOR81,. + 0
- .type __func__.6604, %object
- .size __func__.6604, 26
-__func__.6604:
+ .type __func__.6606, %object
+ .size __func__.6606, 26
+__func__.6606:
.string "ftl_map_blk_alloc_new_blk"
- .section .rodata.__func__.6615,"a",@progbits
+ .section .rodata.__func__.6617,"a",@progbits
.align 3
.set .LANCHOR151,. + 0
- .type __func__.6615, %object
- .size __func__.6615, 15
-__func__.6615:
+ .type __func__.6617, %object
+ .size __func__.6617, 15
+__func__.6617:
.string "ftl_map_blk_gc"
- .section .rodata.__func__.6630,"a",@progbits
+ .section .rodata.__func__.6632,"a",@progbits
.align 3
.set .LANCHOR148,. + 0
- .type __func__.6630, %object
- .size __func__.6630, 31
-__func__.6630:
+ .type __func__.6632, %object
+ .size __func__.6632, 31
+__func__.6632:
.string "Ftl_write_map_blk_to_last_page"
- .section .rodata.__func__.6644,"a",@progbits
+ .section .rodata.__func__.6646,"a",@progbits
.align 3
.set .LANCHOR149,. + 0
- .type __func__.6644, %object
- .size __func__.6644, 16
-__func__.6644:
+ .type __func__.6646, %object
+ .size __func__.6646, 16
+__func__.6646:
.string "FtlMapWritePage"
- .section .rodata.__func__.6669,"a",@progbits
+ .section .rodata.__func__.6671,"a",@progbits
.align 3
.set .LANCHOR57,. + 0
- .type __func__.6669, %object
- .size __func__.6669, 22
-__func__.6669:
+ .type __func__.6671, %object
+ .size __func__.6671, 22
+__func__.6671:
.string "select_l2p_ram_region"
- .section .rodata.__func__.6686,"a",@progbits
+ .section .rodata.__func__.6688,"a",@progbits
.align 3
.set .LANCHOR153,. + 0
- .type __func__.6686, %object
- .size __func__.6686, 9
-__func__.6686:
+ .type __func__.6688, %object
+ .size __func__.6688, 9
+__func__.6688:
.string "log2phys"
- .section .rodata.__func__.6750,"a",@progbits
+ .section .rodata.__func__.6752,"a",@progbits
.align 3
.set .LANCHOR165,. + 0
- .type __func__.6750, %object
- .size __func__.6750, 15
-__func__.6750:
+ .type __func__.6752, %object
+ .size __func__.6752, 15
+__func__.6752:
.string "FtlVpcTblFlush"
- .section .rodata.__func__.6772,"a",@progbits
+ .section .rodata.__func__.6774,"a",@progbits
.align 3
.set .LANCHOR140,. + 0
- .type __func__.6772, %object
- .size __func__.6772, 14
-__func__.6772:
+ .type __func__.6774, %object
+ .size __func__.6774, 14
+__func__.6774:
.string "FtlScanSysBlk"
- .section .rodata.__func__.6828,"a",@progbits
+ .section .rodata.__func__.6830,"a",@progbits
.align 3
.set .LANCHOR178,. + 0
- .type __func__.6828, %object
- .size __func__.6828, 15
-__func__.6828:
+ .type __func__.6830, %object
+ .size __func__.6830, 15
+__func__.6830:
.string "FtlLoadSysInfo"
- .section .rodata.__func__.6850,"a",@progbits
+ .section .rodata.__func__.6852,"a",@progbits
.align 3
.set .LANCHOR180,. + 0
- .type __func__.6850, %object
- .size __func__.6850, 18
-__func__.6850:
+ .type __func__.6852, %object
+ .size __func__.6852, 18
+__func__.6852:
.string "FtlMapTblRecovery"
- .section .rodata.__func__.6896,"a",@progbits
+ .section .rodata.__func__.6898,"a",@progbits
.align 3
.set .LANCHOR154,. + 0
- .type __func__.6896, %object
- .size __func__.6896, 16
-__func__.6896:
+ .type __func__.6898, %object
+ .size __func__.6898, 16
+__func__.6898:
.string "FtlReUsePrevPpa"
- .section .rodata.__func__.6930,"a",@progbits
+ .section .rodata.__func__.6932,"a",@progbits
.align 3
.set .LANCHOR155,. + 0
- .type __func__.6930, %object
- .size __func__.6930, 22
-__func__.6930:
+ .type __func__.6932, %object
+ .size __func__.6932, 22
+__func__.6932:
.string "FtlRecoverySuperblock"
- .section .rodata.__func__.6987,"a",@progbits
+ .section .rodata.__func__.6989,"a",@progbits
.align 3
.set .LANCHOR60,. + 0
- .type __func__.6987, %object
- .size __func__.6987, 16
-__func__.6987:
+ .type __func__.6989, %object
+ .size __func__.6989, 16
+__func__.6989:
.string "make_superblock"
- .section .rodata.__func__.7008,"a",@progbits
+ .section .rodata.__func__.7010,"a",@progbits
.align 3
.set .LANCHOR136,. + 0
- .type __func__.7008, %object
- .size __func__.7008, 18
-__func__.7008:
+ .type __func__.7010, %object
+ .size __func__.7010, 18
+__func__.7010:
.string "SupperBlkListInit"
- .section .rodata.__func__.7035,"a",@progbits
+ .section .rodata.__func__.7037,"a",@progbits
.align 3
.set .LANCHOR159,. + 0
- .type __func__.7035, %object
- .size __func__.7035, 14
-__func__.7035:
+ .type __func__.7037, %object
+ .size __func__.7037, 14
+__func__.7037:
.string "ftl_check_vpc"
- .section .rodata.__func__.7100,"a",@progbits
+ .section .rodata.__func__.7102,"a",@progbits
.align 3
- .set .LANCHOR143,. + 0
- .type __func__.7100, %object
- .size __func__.7100, 25
-__func__.7100:
+ .set .LANCHOR144,. + 0
+ .type __func__.7102, %object
+ .size __func__.7102, 25
+__func__.7102:
.string "allocate_data_superblock"
- .section .rodata.__func__.7121,"a",@progbits
+ .section .rodata.__func__.7123,"a",@progbits
.align 3
.set .LANCHOR168,. + 0
- .type __func__.7121, %object
- .size __func__.7121, 29
-__func__.7121:
+ .type __func__.7123, %object
+ .size __func__.7123, 29
+__func__.7123:
.string "allocate_new_data_superblock"
- .section .rodata.__func__.7128,"a",@progbits
+ .section .rodata.__func__.7130,"a",@progbits
.align 3
.set .LANCHOR61,. + 0
- .type __func__.7128, %object
- .size __func__.7128, 19
-__func__.7128:
+ .type __func__.7130, %object
+ .size __func__.7130, 19
+__func__.7130:
.string "get_new_active_ppa"
- .section .rodata.__func__.7141,"a",@progbits
+ .section .rodata.__func__.7143,"a",@progbits
.align 3
.set .LANCHOR146,. + 0
- .type __func__.7141, %object
- .size __func__.7141, 16
-__func__.7141:
+ .type __func__.7143, %object
+ .size __func__.7143, 16
+__func__.7143:
.string "update_vpc_list"
- .section .rodata.__func__.7148,"a",@progbits
+ .section .rodata.__func__.7150,"a",@progbits
.align 3
.set .LANCHOR147,. + 0
- .type __func__.7148, %object
- .size __func__.7148, 20
-__func__.7148:
+ .type __func__.7150, %object
+ .size __func__.7150, 20
+__func__.7150:
.string "decrement_vpc_count"
- .section .rodata.__func__.7218,"a",@progbits
+ .section .rodata.__func__.7220,"a",@progbits
.align 3
.set .LANCHOR170,. + 0
- .type __func__.7218, %object
- .size __func__.7218, 19
-__func__.7218:
+ .type __func__.7220, %object
+ .size __func__.7220, 19
+__func__.7220:
.string "FtlGcFreeTempBlock"
- .section .rodata.__func__.7316,"a",@progbits
+ .section .rodata.__func__.7319,"a",@progbits
.align 3
.set .LANCHOR175,. + 0
- .type __func__.7316, %object
- .size __func__.7316, 23
-__func__.7316:
+ .type __func__.7319, %object
+ .size __func__.7319, 23
+__func__.7319:
.string "rk_ftl_garbage_collect"
- .section .rodata.__func__.7578,"a",@progbits
+ .section .rodata.__func__.7591,"a",@progbits
.align 3
.set .LANCHOR137,. + 0
- .type __func__.7578, %object
- .size __func__.7578, 15
-__func__.7578:
+ .type __func__.7591, %object
+ .size __func__.7591, 15
+__func__.7591:
.string "FlashReadPages"
- .section .rodata.__func__.7597,"a",@progbits
+ .section .rodata.__func__.7610,"a",@progbits
.align 3
.set .LANCHOR142,. + 0
- .type __func__.7597, %object
- .size __func__.7597, 15
-__func__.7597:
+ .type __func__.7610, %object
+ .size __func__.7610, 15
+__func__.7610:
.string "FlashProgPages"
- .section .rodata.__func__.7621,"a",@progbits
+ .section .rodata.__func__.7634,"a",@progbits
.align 3
.set .LANCHOR77,. + 0
- .type __func__.7621, %object
- .size __func__.7621, 17
-__func__.7621:
+ .type __func__.7634, %object
+ .size __func__.7634, 17
+__func__.7634:
.string "FlashEraseBlocks"
- .section .rodata.__func__.7736,"a",@progbits
+ .section .rodata.__func__.7749,"a",@progbits
.align 3
.set .LANCHOR185,. + 0
- .type __func__.7736, %object
- .size __func__.7736, 14
-__func__.7736:
+ .type __func__.7749, %object
+ .size __func__.7749, 14
+__func__.7749:
.string "FtlWriteToIDB"
.section .rodata.decrement_vpc_count.str1.1,"aMS",@progbits,1
-.LC17:
+.LC21:
.string "decrement_vpc_count %x = %d\n"
.section .rodata.ftl_check_vpc.str1.1,"aMS",@progbits,1
-.LC25:
+.LC29:
.string "...%s enter...\n"
-.LC26:
+.LC30:
.string "FtlCheckVpc2 %x = %x %x\n"
-.LC27:
+.LC31:
.string "free blk vpc error %x = %x %x\n"
.section .rodata.ftl_map_blk_alloc_new_blk.str1.1,"aMS",@progbits,1
.LC10:
.string "FtlFreeSysBlkQueueOut = %x, free count = %d\n"
.section .rodata.ftl_scan_all_data.str1.1,"aMS",@progbits,1
-.LC28:
+.LC32:
.string "ftl_scan_all_data = %x\n"
-.LC29:
+.LC33:
.string "scan lpa = %x ppa= %x\n"
-.LC30:
+.LC34:
.string "lba = %x,addr= %x,spare= %x %x %x %x data=%x %x\n"
.section .rodata.load_l2p_region.str1.1,"aMS",@progbits,1
-.LC20:
+.LC24:
.string "region_id = %x phyAddr = %x\n"
-.LC21:
- .string "spare:"
-.LC22:
+.LC25:
.string "map_ppn:"
-.LC23:
+.LC26:
.string "load_l2p_region refresh = %x phyAddr = %x\n"
+ .section .rodata.rk_ftl_garbage_collect.str1.1,"aMS",@progbits,1
+.LC42:
+ .string "g_gc_superblock_free %x %x %x %x %x\n"
+.LC43:
+ .string "lpa=%x, ppa=%x\n"
.section .rodata.rknand_print_hex.str1.1,"aMS",@progbits,1
.LC2:
.string "%s 0x%x:"
@@ -13165,6 +13214,6 @@ __func__.7736:
.LC5:
.string "\n"
.section .rodata.sftl_init.str1.1,"aMS",@progbits,1
-.LC41:
- .string "SFTL version: 5.0.50 20181227"
+.LC49:
+ .string "SFTL version: 5.0.50 20190215"
.hidden free
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c
index 6613935254..896bcac61c 100644
--- a/drivers/usb/gadget/f_fastboot.c
+++ b/drivers/usb/gadget/f_fastboot.c
@@ -1742,18 +1742,19 @@ static void cb_flashing(struct usb_ep *ep, struct usb_request *req)
static void cb_oem_perm_attr(void)
{
#ifdef CONFIG_RK_AVB_LIBAVB_USER
+#ifndef CONFIG_ROCKCHIP_PRELOADER_PUB_KEY
sha256_context ctx;
uint8_t digest[SHA256_SUM_LEN] = {0};
uint8_t digest_temp[SHA256_SUM_LEN] = {0};
uint8_t perm_attr_temp[PERM_ATTR_TOTAL_SIZE] = {0};
uint8_t flag = 0;
-
+#endif
if (PERM_ATTR_TOTAL_SIZE != download_bytes) {
printf("Permanent attribute size is not equal!\n");
fastboot_tx_write_str("FAILincorrect perm attribute size");
return;
}
-
+#ifndef CONFIG_ROCKCHIP_PRELOADER_PUB_KEY
if (rk_avb_read_perm_attr_flag(&flag)) {
printf("rk_avb_read_perm_attr_flag error!\n");
fastboot_tx_write_str("FAILperm attr read failed");
@@ -1793,7 +1794,7 @@ static void cb_oem_perm_attr(void)
return;
}
}
-
+#endif
if (rk_avb_write_permanent_attributes((uint8_t *)
CONFIG_FASTBOOT_BUF_ADDR,
download_bytes)) {
@@ -1804,7 +1805,7 @@ static void cb_oem_perm_attr(void)
fastboot_tx_write_str("FAILperm attr write failed");
return;
}
-
+#ifndef CONFIG_ROCKCHIP_PRELOADER_PUB_KEY
memset(digest, 0, SHA256_SUM_LEN);
sha256_starts(&ctx);
sha256_update(&ctx, (const uint8_t *)CONFIG_FASTBOOT_BUF_ADDR,
@@ -1829,7 +1830,7 @@ static void cb_oem_perm_attr(void)
return;
}
}
-
+#endif
if (rk_avb_write_perm_attr_flag(PERM_ATTR_SUCCESS_FLAG)) {
fastboot_tx_write_str("FAILperm attr flag write failure");
return;
@@ -1841,6 +1842,27 @@ static void cb_oem_perm_attr(void)
#endif
}
+static void cb_oem_perm_attr_rsa_cer(void)
+{
+#ifdef CONFIG_RK_AVB_LIBAVB_USER
+ if (download_bytes != 256) {
+ printf("Permanent attribute rsahash size is not equal!\n");
+ fastboot_tx_write_str("FAILperm attribute rsahash size error");
+ return;
+ }
+
+ if (rk_avb_set_perm_attr_cer((uint8_t *)CONFIG_FASTBOOT_BUF_ADDR,
+ download_bytes)) {
+ fastboot_tx_write_str("FAILSet perm attr cer fail!");
+ return;
+ }
+
+ fastboot_tx_write_str("OKAY");
+#else
+ fastboot_tx_write_str("FAILnot implemented");
+#endif
+}
+
static void cb_oem(struct usb_ep *ep, struct usb_request *req)
{
char *cmd = req->buf;
@@ -2078,6 +2100,8 @@ static void cb_oem(struct usb_ep *ep, struct usb_request *req)
#endif
} else if (strncmp("fuse at-perm-attr", cmd + 4, 16) == 0) {
cb_oem_perm_attr();
+ } else if (strncmp("fuse at-rsa-perm-attr", cmd + 4, 25) == 0) {
+ cb_oem_perm_attr_rsa_cer();
} else if (strncmp("fuse at-bootloader-vboot-key", cmd + 4, 27) == 0) {
#ifdef CONFIG_RK_AVB_LIBAVB_USER
sha256_context ctx;
diff --git a/drivers/usb/phy/rockchip_usb2_phy.c b/drivers/usb/phy/rockchip_usb2_phy.c
index bafe3cdf85..31efee297a 100644
--- a/drivers/usb/phy/rockchip_usb2_phy.c
+++ b/drivers/usb/phy/rockchip_usb2_phy.c
@@ -9,6 +9,7 @@
#include <asm/io.h>
#include <dm.h>
#include <fdtdec.h>
+#include <fdt_support.h>
#include <syscon.h>
#include "../gadget/dwc2_udc_otg_priv.h"
@@ -93,7 +94,9 @@ static int otg_phy_parse(struct dwc2_udc *dev)
/* Find the usb_otg node */
node = fdt_node_offset_by_compatible(blob, -1, "snps,dwc2");
+#if defined(CONFIG_ROCKCHIP_RK3288)
retry:
+#endif
if (node > 0) {
reg = fdt_getprop(blob, node, "reg", NULL);
if (!reg)
diff --git a/drivers/video/drm/rockchip_display.c b/drivers/video/drm/rockchip_display.c
index d5bf157274..65378c6db4 100644
--- a/drivers/video/drm/rockchip_display.c
+++ b/drivers/video/drm/rockchip_display.c
@@ -45,6 +45,7 @@
**********************************************************************/
#define RK_BLK_SIZE 512
+#define BMP_PROCESSED_FLAG 8399
DECLARE_GLOBAL_DATA_PTR;
static LIST_HEAD(rockchip_display_list);
@@ -465,8 +466,6 @@ bool drm_mode_is_420(const struct drm_display_info *display,
static int display_get_timing(struct display_state *state)
{
struct connector_state *conn_state = &state->conn_state;
- const struct rockchip_connector *conn = conn_state->connector;
- const struct rockchip_connector_funcs *conn_funcs = conn->funcs;
struct drm_display_mode *mode = &conn_state->mode;
const struct drm_display_mode *m;
struct panel_state *panel_state = &state->panel_state;
@@ -485,18 +484,6 @@ static int display_get_timing(struct display_state *state)
goto done;
}
- if (conn_funcs->get_edid && !conn_funcs->get_edid(state)) {
- int panel_bits_per_colourp;
-
- if (!edid_get_drm_mode((void *)&conn_state->edid,
- sizeof(conn_state->edid), mode,
- &panel_bits_per_colourp)) {
- printf("Using display timing from edid\n");
- edid_print_info((void *)&conn_state->edid);
- goto done;
- }
- }
-
printf("failed to find display timing\n");
return -ENODEV;
done:
@@ -524,6 +511,7 @@ static int display_init(struct display_state *state)
struct rockchip_crtc *crtc = crtc_state->crtc;
const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs;
struct drm_display_mode *mode = &conn_state->mode;
+ int bpc;
int ret = 0;
static bool __print_once = false;
@@ -576,13 +564,9 @@ static int display_init(struct display_state *state)
goto deinit;
}
- if (conn_funcs->get_timing) {
- ret = conn_funcs->get_timing(state);
- } else if (panel_state->panel) {
+ if (panel_state->panel) {
ret = display_get_timing(state);
} else if (conn_state->bridge) {
- int bpc;
-
ret = video_bridge_read_edid(conn_state->bridge->dev,
conn_state->edid, EDID_SIZE);
if (ret > 0) {
@@ -591,6 +575,17 @@ static int display_init(struct display_state *state)
if (!ret)
edid_print_info((void *)&conn_state->edid);
}
+ } else if (conn_funcs->get_timing) {
+ ret = conn_funcs->get_timing(state);
+ } else if (conn_funcs->get_edid) {
+ ret = conn_funcs->get_edid(state);
+ if (!ret) {
+ ret = edid_get_drm_mode((void *)&conn_state->edid,
+ sizeof(conn_state->edid), mode,
+ &bpc);
+ if (!ret)
+ edid_print_info((void *)&conn_state->edid);
+ }
}
if (ret)
@@ -929,6 +924,7 @@ static int load_bmp_logo(struct logo_info *logo, const char *bmp_name)
void *dst = NULL, *pdst;
int size, len;
int ret = 0;
+ int reserved = 0;
if (!logo || !bmp_name)
return -EINVAL;
@@ -954,6 +950,9 @@ static int load_bmp_logo(struct logo_info *logo, const char *bmp_name)
logo->bpp = get_unaligned_le16(&header->bit_count);
logo->width = get_unaligned_le32(&header->width);
logo->height = get_unaligned_le32(&header->height);
+ reserved = get_unaligned_le32(&header->reserved);
+ if (logo->height < 0)
+ logo->height = -logo->height;
size = get_unaligned_le32(&header->file_size);
if (!can_direct_logo(logo->bpp)) {
if (size > MEMORY_POOL_SIZE) {
@@ -1001,7 +1000,10 @@ static int load_bmp_logo(struct logo_info *logo, const char *bmp_name)
logo->ymirror = 0;
} else {
logo->offset = get_unaligned_le32(&header->data_offset);
- logo->ymirror = 1;
+ if (reserved == BMP_PROCESSED_FLAG)
+ logo->ymirror = 0;
+ else
+ logo->ymirror = 1;
}
logo->mem = dst;
diff --git a/drivers/video/drm/rockchip_display.h b/drivers/video/drm/rockchip_display.h
index 1c72aa966f..cc719b8aac 100644
--- a/drivers/video/drm/rockchip_display.h
+++ b/drivers/video/drm/rockchip_display.h
@@ -129,7 +129,7 @@ struct logo_info {
bool ymirror;
u32 offset;
u32 width;
- u32 height;
+ int height;
u32 bpp;
};
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index fc46b6774d..629b6523a2 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -78,4 +78,10 @@ config WDT_ORION
Select this to enable Orion watchdog timer, which can be found on some
Marvell Armada chips.
+config ROCKCHIP_WATCHDOG
+ bool "Rockchip watchdog"
+ depends on WDT && ARCH_ROCKCHIP
+ help
+ Say Y here to enable Rockchip watchdog driver.
+
endmenu
diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
index ab6a6b79e1..8504408958 100644
--- a/drivers/watchdog/Makefile
+++ b/drivers/watchdog/Makefile
@@ -22,3 +22,6 @@ obj-$(CONFIG_WDT_ASPEED) += ast_wdt.o
obj-$(CONFIG_WDT_BCM6345) += bcm6345_wdt.o
obj-$(CONFIG_BCM2835_WDT) += bcm2835_wdt.o
obj-$(CONFIG_WDT_ORION) += orion_wdt.o
+ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),)
+obj-$(CONFIG_ROCKCHIP_WATCHDOG) += rockchip_wdt.o
+endif
diff --git a/drivers/watchdog/rockchip_wdt.c b/drivers/watchdog/rockchip_wdt.c
new file mode 100644
index 0000000000..f2962d9d32
--- /dev/null
+++ b/drivers/watchdog/rockchip_wdt.c
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2019 Rockchip Electronics Co., Ltd
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <asm/io.h>
+#include <asm/utils.h>
+#include <clk.h>
+#include <dm.h>
+#include <reset.h>
+#include <wdt.h>
+
+#define WDT_CR 0x00
+#define WDT_TORR 0x04
+#define WDT_CRR 0x0C
+#define WDT_EN_MASK 0x01
+#define WDT_MODE_MASK 0x02
+#define WDT_CRR_RESTART_VAL 0x76
+
+DECLARE_GLOBAL_DATA_PTR;
+
+struct rockchip_wdt_priv {
+ void __iomem *base;
+ struct clk clk;
+ unsigned long rate;
+ struct reset_ctl rst;
+};
+
+/*
+ * Set the watchdog time interval.
+ * Counter is 32 bit.
+ */
+static int rockchip_wdt_settimeout(u64 timeout,
+ struct rockchip_wdt_priv *priv)
+{
+ signed int i;
+
+ /* calculate the timeout range value */
+ i = log_2_n_round_up(timeout * priv->rate / 1000) - 16;
+ if (i > 15)
+ i = 15;
+ if (i < 0)
+ i = 0;
+
+ writel((i | (i << 4)), priv->base + WDT_TORR);
+
+ return 0;
+}
+
+static void rockchip_wdt_enable(struct rockchip_wdt_priv *priv)
+{
+ u32 val = readl(priv->base + WDT_CR);
+
+ /* Disable interrupt mode; always perform system reset. */
+ val &= ~WDT_MODE_MASK;
+ /* Enable watchdog. */
+ val |= WDT_EN_MASK;
+
+ writel(val, priv->base + WDT_CR);
+}
+
+static unsigned int rockchip_wdt_is_enabled(struct rockchip_wdt_priv *priv)
+{
+ unsigned long val;
+
+ val = readl(priv->base + WDT_CR);
+
+ return val & WDT_EN_MASK;
+}
+
+static int rockchip_wdt_reset(struct udevice *dev)
+{
+ struct rockchip_wdt_priv *priv = dev_get_priv(dev);
+
+ if (rockchip_wdt_is_enabled(priv))
+ /* restart the watchdog counter */
+ writel(WDT_CRR_RESTART_VAL, priv->base + WDT_CRR);
+
+ return 0;
+}
+
+static int rockchip_wdt_start(struct udevice *dev, u64 timeout, ulong flags)
+{
+ struct rockchip_wdt_priv *priv = dev_get_priv(dev);
+
+ printf("Rockchip watchdog timeout: %lld sec\n", timeout / 1000);
+
+ reset_deassert(&priv->rst);
+
+ rockchip_wdt_reset(dev);
+ rockchip_wdt_settimeout(timeout, priv);
+ rockchip_wdt_enable(priv);
+ rockchip_wdt_reset(dev);
+
+ return 0;
+}
+
+static int rockchip_wdt_stop(struct udevice *dev)
+{
+ struct rockchip_wdt_priv *priv = dev_get_priv(dev);
+
+ reset_assert(&priv->rst);
+ reset_deassert(&priv->rst);
+
+ printf("Rockchip watchdog stop\n");
+
+ return 0;
+}
+
+static const struct wdt_ops rockchip_wdt_ops = {
+ .start = rockchip_wdt_start,
+ .reset = rockchip_wdt_reset,
+ .stop = rockchip_wdt_stop,
+};
+
+static int rockchip_wdt_ofdata_to_platdata(struct udevice *dev)
+{
+ struct rockchip_wdt_priv *priv = dev_get_priv(dev);
+
+ priv->base = dev_read_addr_ptr(dev);
+ if (!priv->base)
+ return -ENOENT;
+
+ return 0;
+}
+
+static int rockchip_wdt_probe(struct udevice *dev)
+{
+ struct rockchip_wdt_priv *priv = dev_get_priv(dev);
+ int ret;
+
+ ret = reset_get_by_name(dev, "reset", &priv->rst);
+ if (ret) {
+ pr_err("reset_get_by_name(reset) failed: %d\n", ret);
+ return ret;
+ }
+
+ ret = clk_get_by_index(dev, 0, &priv->clk);
+ if (ret < 0)
+ return ret;
+
+ /* Need clk framework support */
+ priv->rate = clk_get_rate(&priv->clk);
+ if (priv->rate < 0)
+ return -EINVAL;
+
+ return 0;
+}
+
+static const struct udevice_id rockchip_wdt_ids[] = {
+ { .compatible = "snps,dw-wdt" },
+ {}
+};
+
+U_BOOT_DRIVER(rockchip_wdt) = {
+ .name = "rockchip_wdt",
+ .id = UCLASS_WDT,
+ .of_match = rockchip_wdt_ids,
+ .probe = rockchip_wdt_probe,
+ .priv_auto_alloc_size = sizeof(struct rockchip_wdt_priv),
+ .ofdata_to_platdata = rockchip_wdt_ofdata_to_platdata,
+ .ops = &rockchip_wdt_ops,
+};
diff --git a/include/amp.h b/include/amp.h
new file mode 100644
index 0000000000..629dcdcd04
--- /dev/null
+++ b/include/amp.h
@@ -0,0 +1,29 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2019 Rockchip Electronics Co., Ltd
+ */
+
+#ifndef _AMP_H_
+#define _AMP_H_
+
+#include <dm.h>
+
+struct dm_amp_ops {
+ int (*cpu_on)(struct udevice *dev);
+};
+
+struct dm_amp_uclass_platdata {
+ const char *desc;
+ const char *partition;
+ u32 cpu; /* cpu mpidr */
+ u32 aarch;
+ u32 load;
+ u32 entry;
+ u32 reserved_mem[2]; /* [0]: start, [1]: size */
+};
+
+int amp_bind_children(struct udevice *dev, const char *drv_name);
+int amp_cpus_on(void);
+int amp_cpu_on(u32 cpu);
+
+#endif /* _AMP_H_ */
diff --git a/include/android_avb/avb_ab_flow.h b/include/android_avb/avb_ab_flow.h
index 0ba5ccd47c..152901b7c7 100755
--- a/include/android_avb/avb_ab_flow.h
+++ b/include/android_avb/avb_ab_flow.h
@@ -1,277 +1,278 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * 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.
- */
-
-/*
-#if !defined(AVB_INSIDE_LIBAVB_AB_H) && !defined(AVB_COMPILATION)
-#error \
- "Never include this file directly, include libavb_ab/libavb_ab.h instead."
-#endif
-*/
-
-#ifndef AVB_AB_FLOW_H_
-#define AVB_AB_FLOW_H_
-
-#include <android_avb/avb_ab_ops.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Magic for the A/B struct when serialized. */
-#define AVB_AB_MAGIC "\0AB0"
-#define AVB_AB_MAGIC_LEN 4
-
-/* Versioning for the on-disk A/B metadata - keep in sync with avbtool. */
-#define AVB_AB_MAJOR_VERSION 1
-#define AVB_AB_MINOR_VERSION 0
-
-/* Size of AvbABData struct. */
-#define AVB_AB_DATA_SIZE 32
-
-/* Maximum values for slot data */
-#define AVB_AB_MAX_PRIORITY 15
-#define AVB_AB_MAX_TRIES_REMAINING 7
-
-/* Struct used for recording per-slot metadata.
- *
- * When serialized, data is stored in network byte-order.
- */
-typedef struct AvbABSlotData {
- /* Slot priority. Valid values range from 0 to AVB_AB_MAX_PRIORITY,
- * both inclusive with 1 being the lowest and AVB_AB_MAX_PRIORITY
- * being the highest. The special value 0 is used to indicate the
- * slot is unbootable.
- */
- uint8_t priority;
-
- /* Number of times left attempting to boot this slot ranging from 0
- * to AVB_AB_MAX_TRIES_REMAINING.
- */
- uint8_t tries_remaining;
-
- /* Non-zero if this slot has booted successfully, 0 otherwise. */
- uint8_t successful_boot;
-
- /* Reserved for future use. */
- uint8_t reserved[1];
-} AVB_ATTR_PACKED AvbABSlotData;
-
-/* Struct used for recording A/B metadata.
- *
- * When serialized, data is stored in network byte-order.
- */
-typedef struct AvbABData {
- /* Magic number used for identification - see AVB_AB_MAGIC. */
- uint8_t magic[AVB_AB_MAGIC_LEN];
-
- /* Version of on-disk struct - see AVB_AB_{MAJOR,MINOR}_VERSION. */
- uint8_t version_major;
- uint8_t version_minor;
-
- /* Padding to ensure |slots| field start eight bytes in. */
- uint8_t reserved1[2];
-
- /* Per-slot metadata. */
- AvbABSlotData slots[2];
-
- /* Reserved for future use. */
- uint8_t reserved2[12];
-
- /* CRC32 of all 28 bytes preceding this field. */
- uint32_t crc32;
-} AVB_ATTR_PACKED AvbABData;
-
-/* Copies |src| to |dest|, byte-swapping fields in the
- * process. Returns false if the data is invalid (e.g. wrong magic,
- * wrong CRC32 etc.), true otherwise.
- */
-bool avb_ab_data_verify_and_byteswap(const AvbABData* src, AvbABData* dest);
-
-/* Copies |src| to |dest|, byte-swapping fields in the process. Also
- * updates the |crc32| field in |dest|.
- */
-void avb_ab_data_update_crc_and_byteswap(const AvbABData* src, AvbABData* dest);
-
-/* Initializes |data| such that it has two slots and both slots have
- * maximum tries remaining. The CRC is not set.
- */
-void avb_ab_data_init(AvbABData* data);
-
-/* Reads A/B metadata from the 'misc' partition using |ops|. Returned
- * data is properly byteswapped. Returns AVB_IO_RESULT_OK on
- * success, error code otherwise.
- *
- * If the data read from disk is invalid (e.g. wrong magic or CRC
- * checksum failure), the metadata will be reset using
- * avb_ab_data_init() and then written to disk.
- */
-AvbIOResult avb_ab_data_read(AvbABOps* ab_ops, AvbABData* data);
-
-/* Writes A/B metadata to the 'misc' partition using |ops|. This will
- * byteswap and update the CRC as needed. Returns AVB_IO_RESULT_OK on
- * success, error code otherwise.
- */
-AvbIOResult avb_ab_data_write(AvbABOps* ab_ops, const AvbABData* data);
-
-/* Return codes used in avb_ab_flow(), see that function for
- * documentation of each value.
- */
-typedef enum {
- AVB_AB_FLOW_RESULT_OK,
- AVB_AB_FLOW_RESULT_OK_WITH_VERIFICATION_ERROR,
- AVB_AB_FLOW_RESULT_ERROR_OOM,
- AVB_AB_FLOW_RESULT_ERROR_IO,
- AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS,
- AVB_AB_FLOW_RESULT_ERROR_INVALID_ARGUMENT
-} AvbABFlowResult;
-
-/* Get a textual representation of |result|. */
-const char* avb_ab_flow_result_to_string(AvbABFlowResult result);
-
-/* High-level function to select a slot to boot. The following
- * algorithm is used:
- *
- * 1. A/B metadata is loaded and validated using the
- * read_ab_metadata() operation. Typically this means it's read from
- * the 'misc' partition and if it's invalid then it's reset using
- * avb_ab_data_init() and this reset metadata is returned.
- *
- * 2. All bootable slots listed in the A/B metadata are verified using
- * avb_slot_verify(). If a slot is invalid or if it fails verification
- * (and AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR is not set, see
- * below), it will be marked as unbootable in the A/B metadata and the
- * metadata will be saved to disk before returning.
- *
- * 3. If there are no bootable slots, the value
- * AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS is returned.
- *
- * 4. For each bootable slot, the Stored Rollback Indexes are updated
- * such that for each rollback index location, the Stored Rollback
- * Index is the largest number smaller than or equal to the Rollback
- * Index of each slot.
- *
- * 5. The bootable slot with the highest priority is selected and
- * returned in |out_data|. If this slot is already marked as
- * successful, the A/B metadata is not modified. However, if the slot
- * is not marked as bootable its |tries_remaining| count is
- * decremented and the A/B metadata is saved to disk before returning.
- * In either case the value AVB_AB_FLOW_RESULT_OK is returning.
- *
- * The partitions to load is given in |requested_partitions| as a
- * NULL-terminated array of NUL-terminated strings. Typically the
- * |requested_partitions| array only contains a single item for the
- * boot partition, 'boot'.
- *
- * If the device is unlocked (and _only_ if it's unlocked), the
- * AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR flag should be set
- * in the |flags| parameter. This will allow considering slots as
- * verified even when avb_slot_verify() returns
- * AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED,
- * AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION, or
- * AVB_SLOT_VERIFY_RESULT_ERROR_ROLLBACK_INDEX for the slot in
- * question.
- *
- * Note that neither androidboot.slot_suffix nor androidboot.slot are
- * set in the |cmdline| field in |AvbSlotVerifyData| - you will have
- * to pass these yourself.
- *
- * If a slot was selected and it verified then AVB_AB_FLOW_RESULT_OK
- * is returned.
- *
- * If a slot was selected but it didn't verify then
- * AVB_AB_FLOW_RESULT_OK_WITH_VERIFICATION_ERROR is returned. This can
- * only happen when the AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR
- * flag is set.
- *
- * If an I/O operation - such as loading/saving metadata or checking
- * rollback indexes - fail, the value AVB_AB_FLOW_RESULT_ERROR_IO is
- * returned.
- *
- * If memory allocation fails, AVB_AB_FLOW_RESULT_ERROR_OOM is
- * returned.
- *
- * If invalid arguments are passed,
- * AVB_AB_FLOW_RESULT_ERROR_INVALID_ARGUMENT is returned. For example
- * this can happen if using AVB_HASHTREE_ERROR_MODE_LOGGING without
- * AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR.
- *
- * Reasonable behavior for handling AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS
- * is to initiate device repair (which is device-dependent).
- */
-AvbABFlowResult avb_ab_flow(AvbABOps* ab_ops,
- const char* const* requested_partitions,
- AvbSlotVerifyFlags flags,
- AvbHashtreeErrorMode hashtree_error_mode,
- AvbSlotVerifyData** out_data);
-
-/* Marks the slot with the given slot number as active. Returns
- * AVB_IO_RESULT_OK on success, error code otherwise.
- *
- * This function is typically used by the OS updater when completing
- * an update. It can also used by the firmware for implementing the
- * "set_active" command.
- */
-AvbIOResult avb_ab_mark_slot_active(AvbABOps* ab_ops, unsigned int slot_number);
-
-/* Marks the slot with the given slot number as unbootable. Returns
- * AVB_IO_RESULT_OK on success, error code otherwise.
- *
- * This function is typically used by the OS updater before writing to
- * a slot.
- */
-AvbIOResult avb_ab_mark_slot_unbootable(AvbABOps* ab_ops,
- unsigned int slot_number);
-
-/* Marks the slot with the given slot number as having booted
- * successfully. Returns AVB_IO_RESULT_OK on success, error code
- * otherwise.
- *
- * Calling this on an unbootable slot is an error - AVB_IO_RESULT_OK
- * will be returned yet the function will have no side-effects.
- *
- * This function is typically used by the OS updater after having
- * confirmed that the slot works as intended.
- */
-AvbIOResult avb_ab_mark_slot_successful(AvbABOps* ab_ops,
- unsigned int slot_number);
-
-/*
- * Load metadata.
- */
-AvbIOResult load_metadata(AvbABOps* ab_ops,
- AvbABData* ab_data,
- AvbABData* ab_data_orig);
-
-/* Writes A/B metadata to disk only if it has changed - returns
- * AVB_IO_RESULT_OK on success, error code otherwise.
- */
-AvbIOResult save_metadata_if_changed(AvbABOps* ab_ops,
- AvbABData* ab_data,
- AvbABData* ab_data_orig);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* AVB_AB_FLOW_H_ */
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/*
+#if !defined(AVB_INSIDE_LIBAVB_AB_H) && !defined(AVB_COMPILATION)
+#error \
+ "Never include this file directly, include libavb_ab/libavb_ab.h instead."
+#endif
+*/
+
+#ifndef AVB_AB_FLOW_H_
+#define AVB_AB_FLOW_H_
+
+#include <android_avb/avb_ab_ops.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Magic for the A/B struct when serialized. */
+#define AVB_AB_MAGIC "\0AB0"
+#define AVB_AB_MAGIC_LEN 4
+
+/* Versioning for the on-disk A/B metadata - keep in sync with avbtool. */
+#define AVB_AB_MAJOR_VERSION 1
+#define AVB_AB_MINOR_VERSION 0
+
+/* Size of AvbABData struct. */
+#define AVB_AB_DATA_SIZE 32
+
+/* Maximum values for slot data */
+#define AVB_AB_MAX_PRIORITY 15
+#define AVB_AB_MAX_TRIES_REMAINING 7
+
+/* Struct used for recording per-slot metadata.
+ *
+ * When serialized, data is stored in network byte-order.
+ */
+typedef struct AvbABSlotData {
+ /* Slot priority. Valid values range from 0 to AVB_AB_MAX_PRIORITY,
+ * both inclusive with 1 being the lowest and AVB_AB_MAX_PRIORITY
+ * being the highest. The special value 0 is used to indicate the
+ * slot is unbootable.
+ */
+ uint8_t priority;
+
+ /* Number of times left attempting to boot this slot ranging from 0
+ * to AVB_AB_MAX_TRIES_REMAINING.
+ */
+ uint8_t tries_remaining;
+
+ /* Non-zero if this slot has booted successfully, 0 otherwise. */
+ uint8_t successful_boot;
+
+ /* Reserved for future use. */
+ uint8_t reserved[1];
+} AVB_ATTR_PACKED AvbABSlotData;
+
+/* Struct used for recording A/B metadata.
+ *
+ * When serialized, data is stored in network byte-order.
+ */
+typedef struct AvbABData {
+ /* Magic number used for identification - see AVB_AB_MAGIC. */
+ uint8_t magic[AVB_AB_MAGIC_LEN];
+
+ /* Version of on-disk struct - see AVB_AB_{MAJOR,MINOR}_VERSION. */
+ uint8_t version_major;
+ uint8_t version_minor;
+
+ /* Padding to ensure |slots| field start eight bytes in. */
+ uint8_t reserved1[2];
+
+ /* Per-slot metadata. */
+ AvbABSlotData slots[2];
+
+ /* Reserved for future use. */
+ uint8_t last_boot;
+ uint8_t reserved2[11];
+
+ /* CRC32 of all 28 bytes preceding this field. */
+ uint32_t crc32;
+} AVB_ATTR_PACKED AvbABData;
+
+/* Copies |src| to |dest|, byte-swapping fields in the
+ * process. Returns false if the data is invalid (e.g. wrong magic,
+ * wrong CRC32 etc.), true otherwise.
+ */
+bool avb_ab_data_verify_and_byteswap(const AvbABData* src, AvbABData* dest);
+
+/* Copies |src| to |dest|, byte-swapping fields in the process. Also
+ * updates the |crc32| field in |dest|.
+ */
+void avb_ab_data_update_crc_and_byteswap(const AvbABData* src, AvbABData* dest);
+
+/* Initializes |data| such that it has two slots and both slots have
+ * maximum tries remaining. The CRC is not set.
+ */
+void avb_ab_data_init(AvbABData* data);
+
+/* Reads A/B metadata from the 'misc' partition using |ops|. Returned
+ * data is properly byteswapped. Returns AVB_IO_RESULT_OK on
+ * success, error code otherwise.
+ *
+ * If the data read from disk is invalid (e.g. wrong magic or CRC
+ * checksum failure), the metadata will be reset using
+ * avb_ab_data_init() and then written to disk.
+ */
+AvbIOResult avb_ab_data_read(AvbABOps* ab_ops, AvbABData* data);
+
+/* Writes A/B metadata to the 'misc' partition using |ops|. This will
+ * byteswap and update the CRC as needed. Returns AVB_IO_RESULT_OK on
+ * success, error code otherwise.
+ */
+AvbIOResult avb_ab_data_write(AvbABOps* ab_ops, const AvbABData* data);
+
+/* Return codes used in avb_ab_flow(), see that function for
+ * documentation of each value.
+ */
+typedef enum {
+ AVB_AB_FLOW_RESULT_OK,
+ AVB_AB_FLOW_RESULT_OK_WITH_VERIFICATION_ERROR,
+ AVB_AB_FLOW_RESULT_ERROR_OOM,
+ AVB_AB_FLOW_RESULT_ERROR_IO,
+ AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS,
+ AVB_AB_FLOW_RESULT_ERROR_INVALID_ARGUMENT
+} AvbABFlowResult;
+
+/* Get a textual representation of |result|. */
+const char* avb_ab_flow_result_to_string(AvbABFlowResult result);
+
+/* High-level function to select a slot to boot. The following
+ * algorithm is used:
+ *
+ * 1. A/B metadata is loaded and validated using the
+ * read_ab_metadata() operation. Typically this means it's read from
+ * the 'misc' partition and if it's invalid then it's reset using
+ * avb_ab_data_init() and this reset metadata is returned.
+ *
+ * 2. All bootable slots listed in the A/B metadata are verified using
+ * avb_slot_verify(). If a slot is invalid or if it fails verification
+ * (and AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR is not set, see
+ * below), it will be marked as unbootable in the A/B metadata and the
+ * metadata will be saved to disk before returning.
+ *
+ * 3. If there are no bootable slots, the value
+ * AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS is returned.
+ *
+ * 4. For each bootable slot, the Stored Rollback Indexes are updated
+ * such that for each rollback index location, the Stored Rollback
+ * Index is the largest number smaller than or equal to the Rollback
+ * Index of each slot.
+ *
+ * 5. The bootable slot with the highest priority is selected and
+ * returned in |out_data|. If this slot is already marked as
+ * successful, the A/B metadata is not modified. However, if the slot
+ * is not marked as bootable its |tries_remaining| count is
+ * decremented and the A/B metadata is saved to disk before returning.
+ * In either case the value AVB_AB_FLOW_RESULT_OK is returning.
+ *
+ * The partitions to load is given in |requested_partitions| as a
+ * NULL-terminated array of NUL-terminated strings. Typically the
+ * |requested_partitions| array only contains a single item for the
+ * boot partition, 'boot'.
+ *
+ * If the device is unlocked (and _only_ if it's unlocked), the
+ * AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR flag should be set
+ * in the |flags| parameter. This will allow considering slots as
+ * verified even when avb_slot_verify() returns
+ * AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED,
+ * AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION, or
+ * AVB_SLOT_VERIFY_RESULT_ERROR_ROLLBACK_INDEX for the slot in
+ * question.
+ *
+ * Note that neither androidboot.slot_suffix nor androidboot.slot are
+ * set in the |cmdline| field in |AvbSlotVerifyData| - you will have
+ * to pass these yourself.
+ *
+ * If a slot was selected and it verified then AVB_AB_FLOW_RESULT_OK
+ * is returned.
+ *
+ * If a slot was selected but it didn't verify then
+ * AVB_AB_FLOW_RESULT_OK_WITH_VERIFICATION_ERROR is returned. This can
+ * only happen when the AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR
+ * flag is set.
+ *
+ * If an I/O operation - such as loading/saving metadata or checking
+ * rollback indexes - fail, the value AVB_AB_FLOW_RESULT_ERROR_IO is
+ * returned.
+ *
+ * If memory allocation fails, AVB_AB_FLOW_RESULT_ERROR_OOM is
+ * returned.
+ *
+ * If invalid arguments are passed,
+ * AVB_AB_FLOW_RESULT_ERROR_INVALID_ARGUMENT is returned. For example
+ * this can happen if using AVB_HASHTREE_ERROR_MODE_LOGGING without
+ * AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR.
+ *
+ * Reasonable behavior for handling AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS
+ * is to initiate device repair (which is device-dependent).
+ */
+AvbABFlowResult avb_ab_flow(AvbABOps* ab_ops,
+ const char* const* requested_partitions,
+ AvbSlotVerifyFlags flags,
+ AvbHashtreeErrorMode hashtree_error_mode,
+ AvbSlotVerifyData** out_data);
+
+/* Marks the slot with the given slot number as active. Returns
+ * AVB_IO_RESULT_OK on success, error code otherwise.
+ *
+ * This function is typically used by the OS updater when completing
+ * an update. It can also used by the firmware for implementing the
+ * "set_active" command.
+ */
+AvbIOResult avb_ab_mark_slot_active(AvbABOps* ab_ops, unsigned int slot_number);
+
+/* Marks the slot with the given slot number as unbootable. Returns
+ * AVB_IO_RESULT_OK on success, error code otherwise.
+ *
+ * This function is typically used by the OS updater before writing to
+ * a slot.
+ */
+AvbIOResult avb_ab_mark_slot_unbootable(AvbABOps* ab_ops,
+ unsigned int slot_number);
+
+/* Marks the slot with the given slot number as having booted
+ * successfully. Returns AVB_IO_RESULT_OK on success, error code
+ * otherwise.
+ *
+ * Calling this on an unbootable slot is an error - AVB_IO_RESULT_OK
+ * will be returned yet the function will have no side-effects.
+ *
+ * This function is typically used by the OS updater after having
+ * confirmed that the slot works as intended.
+ */
+AvbIOResult avb_ab_mark_slot_successful(AvbABOps* ab_ops,
+ unsigned int slot_number);
+
+/*
+ * Load metadata.
+ */
+AvbIOResult load_metadata(AvbABOps* ab_ops,
+ AvbABData* ab_data,
+ AvbABData* ab_data_orig);
+
+/* Writes A/B metadata to disk only if it has changed - returns
+ * AVB_IO_RESULT_OK on success, error code otherwise.
+ */
+AvbIOResult save_metadata_if_changed(AvbABOps* ab_ops,
+ AvbABData* ab_data,
+ AvbABData* ab_data_orig);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AVB_AB_FLOW_H_ */
diff --git a/include/android_avb/rk_avb_ops_user.h b/include/android_avb/rk_avb_ops_user.h
index 0a70e7096b..441856c33c 100644
--- a/include/android_avb/rk_avb_ops_user.h
+++ b/include/android_avb/rk_avb_ops_user.h
@@ -30,6 +30,13 @@ extern "C" {
#define RPMB_BASE_ADDR (64*1024/256)
#define UBOOT_RB_INDEX_OFFSET 24
#define TRUST_RB_INDEX_OFFSET 28
+#define ROCHCHIP_RSA_PARAMETER_SIZE 64
+
+struct rk_pub_key {
+ u_int32_t rsa_n[ROCHCHIP_RSA_PARAMETER_SIZE];
+ u_int32_t rsa_e[ROCHCHIP_RSA_PARAMETER_SIZE];
+ u_int32_t rsa_c[ROCHCHIP_RSA_PARAMETER_SIZE];
+};
/**
* Provided to fastboot to read how many slot in this system.
@@ -267,6 +274,38 @@ int rk_auth_unlock(void *buffer, char *out_is_trusted);
*/
int rk_generate_unlock_challenge(void *buffer, uint32_t *challenge_len);
+/**
+ * Get last boot slot
+ *
+ * @return 0 is slot A; 1 is slot B; -1 is error
+ */
+int rk_get_lastboot(void);
+
+/**
+ * Get permanent attribute certificate
+ *
+ * @param cer: certificate data
+ *
+ * @param size: certificate size
+ */
+int rk_avb_get_perm_attr_cer(uint8_t *cer, uint32_t size);
+
+/**
+ * Set permanent attribute certificate
+ *
+ * @param cer: certificate data
+ *
+ * @param size: certificate size
+ */
+int rk_avb_set_perm_attr_cer(uint8_t *cer, uint32_t size);
+
+/**
+ * Get public key
+ *
+ * @param pub_key: public key data
+ */
+int rk_avb_get_pub_key(struct rk_pub_key *pub_key);
+
#ifdef __cplusplus
}
#endif
diff --git a/include/bidram.h b/include/bidram.h
new file mode 100644
index 0000000000..3b39d442fd
--- /dev/null
+++ b/include/bidram.h
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2019 Rockchip Electronics Co., Ltd
+ */
+
+#ifndef _BIDRAM_H
+#define _BIDRAM_H
+
+#include <memblk.h>
+
+typedef struct memblock *(*parse_fn_t)(int *);
+
+struct bidram {
+ struct lmb lmb;
+ struct list_head reserved_head;
+ bool has_init;
+};
+
+/**
+ * bidram_initr() - Initial bidram after relocation.
+ *
+ * @return 0 on success, otherwise error
+ */
+int bidram_initr(void);
+
+/**
+ * bidram_get_ram_size() - Initial bidram and get ram size.
+ *
+ * @parse_fn: function to parse ddr memory regions
+ *
+ * @return ram size, 0 on success, otherwise the effect ram size.
+ */
+phys_size_t bidram_get_ram_size(void);
+
+/**
+ * bidram_gen_gd_bi_dram() - Update gd->bd->bi_dram[] according to bidram state.
+ */
+void bidram_gen_gd_bi_dram(void);
+
+/**
+ * bidram_reserve() - Reserve bidram region
+ *
+ * @id: memblk id
+ * @base: region base address
+ * @size: region size
+ *
+ * @return 0 on success, otherwise error
+ */
+int bidram_reserve(enum memblk_id id, phys_addr_t base, phys_size_t size);
+
+/**
+ * bidram_reserve_by_name() - Reserve bidram region by name
+ *
+ * @name: region name
+ * @base: region base address
+ * @size: region size
+ *
+ * @return 0 on success, otherwise error
+ */
+int bidram_reserve_by_name(const char *name, phys_addr_t base, phys_size_t size);
+
+/**
+ * bidram_dump_all() - Dump all bidram stat
+ */
+void bidram_dump(void);
+
+/**
+ * board_bidram_parse_fn() - Weak function for board to implement
+ */
+parse_fn_t board_bidram_parse_fn(void);
+
+/**
+ * board_bidram_reserve() - Weak function for board to implement
+ *
+ * @bidram: global bidram point, ignored
+ *
+ * @return 0 on success, otherwise error
+ */
+int board_bidram_reserve(struct bidram *bidram);
+
+#endif /* _BIDRAM_H */
diff --git a/include/boot_rkimg.h b/include/boot_rkimg.h
index e88375159f..795ad62901 100644
--- a/include/boot_rkimg.h
+++ b/include/boot_rkimg.h
@@ -29,6 +29,9 @@ enum _boot_mode {
int rockchip_get_boot_mode(void);
int boot_rockchip_image(struct blk_desc *dev, disk_partition_t *boot_part);
+int read_rockchip_image(struct blk_desc *dev_desc,
+ disk_partition_t *part_info, void *dst);
+
struct blk_desc *rockchip_get_bootdev(void);
/*
diff --git a/include/configs/evb_px5.h b/include/configs/evb_px5.h
index 4160187d50..b6866b5f0d 100644
--- a/include/configs/evb_px5.h
+++ b/include/configs/evb_px5.h
@@ -10,5 +10,6 @@
#include <configs/rk3368_common.h>
#define CONFIG_CONSOLE_SCROLL_LINES 10
+#define CONFIG_SYS_MMC_ENV_DEV 0
#endif
diff --git a/include/configs/rk3368_common.h b/include/configs/rk3368_common.h
index e7f4178f0c..5ef4a3b9f2 100644
--- a/include/configs/rk3368_common.h
+++ b/include/configs/rk3368_common.h
@@ -15,7 +15,7 @@
#include <linux/sizes.h>
#define CONFIG_SYS_SDRAM_BASE 0
-#define SDRAM_MAX_SIZE 0xff000000
+#define SDRAM_MAX_SIZE 0xfe000000
#define CONFIG_BAUDRATE 115200
#define CONFIG_SYS_MALLOC_LEN (192 << 20)
#define CONFIG_SYS_CBSIZE 1024
@@ -28,9 +28,10 @@
#define CONFIG_SPL_FRAMEWORK
#define CONFIG_SPL_TEXT_BASE 0x00000000
-#define CONFIG_SPL_MAX_SIZE 0x40000
+#define CONFIG_SPL_MAX_SIZE 0x60000
#define CONFIG_SPL_BSS_START_ADDR 0x400000
#define CONFIG_SPL_BSS_MAX_SIZE 0x20000
+#define CONFIG_SPL_STACK 0x00188000
#define GICD_BASE 0xffB71000
#define GICC_BASE 0xffB72000
diff --git a/include/configs/rv1108_common.h b/include/configs/rv1108_common.h
index 44cd4e3f6f..0463f236b8 100644
--- a/include/configs/rv1108_common.h
+++ b/include/configs/rv1108_common.h
@@ -22,7 +22,7 @@
/* SPL support */
#define CONFIG_SPL_STACK 0x10080700
#define CONFIG_SPL_TEXT_BASE 0x10080800
-#define CONFIG_SPL_MAX_SIZE 0x1700
+#define CONFIG_SPL_MAX_SIZE 0x4000
/* BSS setup */
#define CONFIG_SPL_BSS_MAX_SIZE 0x100
diff --git a/include/console.h b/include/console.h
index d72c8cdf35..3af98a622a 100644
--- a/include/console.h
+++ b/include/console.h
@@ -12,6 +12,8 @@ extern char console_buffer[];
#define CONSOLE_EVT_CTRL_B 0x02
#define CONSOLE_EVT_CTRL_D 0x04
+#define CONSOLE_EVT_CTRL_F 0x06
+#define CONSOLE_EVT_CTRL_M 0x0D
/* common/console.c */
int console_init_f(void); /* Before relocation; uses the serial stuff */
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
index 70910f319e..b51b9873f2 100644
--- a/include/dm/uclass-id.h
+++ b/include/dm/uclass-id.h
@@ -31,6 +31,7 @@ enum uclass_id {
UCLASS_BLK, /* Block device */
UCLASS_CLK, /* Clock source, e.g. used by peripherals */
UCLASS_CPU, /* CPU, typically part of an SoC */
+ UCLASS_AMP, /* Asymmetric Multi-Processing */
UCLASS_CODEC, /* audio codec */
UCLASS_CROS_EC, /* Chrome OS EC */
UCLASS_DISPLAY, /* Display (e.g. DisplayPort, HDMI) */
diff --git a/include/dt-bindings/clock/rk1808-cru.h b/include/dt-bindings/clock/rk1808-cru.h
index 3dd5c76d52..994896d111 100644
--- a/include/dt-bindings/clock/rk1808-cru.h
+++ b/include/dt-bindings/clock/rk1808-cru.h
@@ -111,6 +111,7 @@
#define SCLK_MIPIDSIPHY_REF 110
#define SCLK_PCIEPHY_REF 111
#define SCLK_RTC32K_FRAC 112
+#define SCLK_32K_IOE 113
/* aclk gates */
#define ACLK_GIC_PRE 145
diff --git a/include/image.h b/include/image.h
index 8daffcceee..11c65292ba 100644
--- a/include/image.h
+++ b/include/image.h
@@ -693,6 +693,8 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob);
#ifdef CONFIG_SYSMEM
int boot_fdt_add_sysmem_rsv_regions(void *fdt_blob);
+#else
+static inline int boot_fdt_add_sysmem_rsv_regions(void *fdt_blob) { return 0; }
#endif
int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size);
diff --git a/include/irq-platform.h b/include/irq-platform.h
index b07d576057..5ae9e973b1 100644
--- a/include/irq-platform.h
+++ b/include/irq-platform.h
@@ -104,7 +104,8 @@
#define GPIO_BANK_NUM 4
#define GPIO_BANK_PINS 32
-#define IRQ_TIMER1 79
+#define IRQ_TIMER0 98
+#define IRQ_TIMER1 99
#define IRQ_PWM 110
#define IRQ_GPIO0 113
#define IRQ_GPIO1 114
diff --git a/include/key.h b/include/key.h
index f85e1f3164..c9e11bd874 100644
--- a/include/key.h
+++ b/include/key.h
@@ -18,49 +18,43 @@ enum {
GPIO_KEY = 0x2,
};
-enum key_state {
+enum key_event {
KEY_PRESS_NONE, /* press without release */
KEY_PRESS_DOWN, /* press -> release */
KEY_PRESS_LONG_DOWN,
KEY_NOT_EXIST,
};
-struct input_key {
- struct udevice *parent;
- struct list_head link;
+struct dm_key_uclass_platdata {
const char *name;
bool pre_reloc;
u32 code;
u8 type;
/* ADC key */
- u32 adcval;
- u32 vref;
u8 channel;
+ u32 adcval;
+ u32 min;
+ u32 max;
/* GPIO key */
u32 irq;
+ u32 gpios[2];
struct gpio_desc gpio;
- /* Event */
- u64 up_t;
- u64 down_t;
-};
-
-struct dm_key_ops {
- const char *name;
+ u64 rise_ms;
+ u64 fall_ms;
};
/* Use it instead of get_timer() in key interrupt handler */
uint64_t key_timer(uint64_t base);
-/* Reister you key to dm key framework */
-void key_add(struct input_key *key);
-
/* Confirm if your key value is a press event */
int key_is_pressed(int keyval);
/* Read key */
int key_read(int code);
+int key_bind_children(struct udevice *dev, const char *drv_name);
+
#endif
diff --git a/include/lmb.h b/include/lmb.h
index 6b6959fd86..ece2a54e5b 100644
--- a/include/lmb.h
+++ b/include/lmb.h
@@ -11,7 +11,7 @@
* SPDX-License-Identifier: GPL-2.0+
*/
-#define MAX_LMB_REGIONS 8
+#define MAX_LMB_REGIONS 16
struct lmb_property {
phys_addr_t base;
diff --git a/include/memblk.h b/include/memblk.h
new file mode 100644
index 0000000000..bba5de000e
--- /dev/null
+++ b/include/memblk.h
@@ -0,0 +1,63 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2019 Rockchip Electronics Co., Ltd
+ */
+
+#ifndef _MEMBLK_H
+#define _MEMBLK_H
+
+enum memblk_id {
+ MEMBLK_ID_UNK,
+
+ /* Preloader */
+ MEMBLK_ID_ATF,
+ MEMBLK_ID_OPTEE,
+ MEMBLK_ID_SHM,
+
+ /* U-Boot self */
+ MEMBLK_ID_UBOOT,
+ MEMBLK_ID_STACK,
+ MEMBLK_ID_FASTBOOT,
+
+ /* Image */
+ MEMBLK_ID_RAMDISK,
+ MEMBLK_ID_FDT,
+ MEMBLK_ID_FDT_DTBO,
+ MEMBLK_ID_FDT_AOSP,
+ MEMBLK_ID_KERNEL,
+ MEMBLK_ID_ANDROID,
+
+ /* Other */
+ MEMBLK_ID_BY_NAME,
+ MEMBLK_ID_FDT_RESV,
+ MEMBLK_ID_DEMO,
+ MEMBLK_ID_MAX,
+};
+
+struct memblk_attr {
+ const char *name;
+ const char *alias[2];
+ u32 flags;
+};
+
+struct memblock {
+ phys_addr_t base;
+ phys_size_t size;
+ struct memblk_attr attr;
+ struct list_head node;
+};
+
+extern const struct memblk_attr *mem_attr;
+
+#define SIZE_MB(len) ((len) >> 20)
+#define SIZE_KB(len) (((len) % (1 << 20)) >> 10)
+
+#define M_ATTR_NONE 0
+/* Over-Flow-Check for region tail */
+#define M_ATTR_OFC (1 << 0)
+/* Over-Flow-Check for region Head, only for U-Boot stack */
+#define M_ATTR_HOFC (1 << 1)
+/* Memory can be overlap by fdt reserved memory */
+#define M_ATTR_OVERLAP (1 << 2)
+
+#endif /* _MEMBLK_H */
diff --git a/include/optee_include/OpteeClientInterface.h b/include/optee_include/OpteeClientInterface.h
index c2e6f90c8f..b99229ee90 100644
--- a/include/optee_include/OpteeClientInterface.h
+++ b/include/optee_include/OpteeClientInterface.h
@@ -14,7 +14,7 @@
#define ATTEST_UUID_SIZE (ATAP_HEX_UUID_LEN+1)
#define ATTEST_CA_OUT_SIZE 256
-void test_optee(void);
+uint32_t test_optee(void);
uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value);
uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value);
uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size);
diff --git a/include/optee_include/OpteeClientMem.h b/include/optee_include/OpteeClientMem.h
index ba85f829c3..1b9affbf36 100644
--- a/include/optee_include/OpteeClientMem.h
+++ b/include/optee_include/OpteeClientMem.h
@@ -9,7 +9,7 @@
#include <linux/types.h>
-void OpteeClientMemInit(void);
+int OpteeClientMemInit(void);
void *OpteeClientMemAlloc(uint32_t length);
diff --git a/include/optee_include/OpteeClientRkFs-v2.h b/include/optee_include/OpteeClientRkFs-v2.h
index a8ee4d6c5b..57138a07dd 100644
--- a/include/optee_include/OpteeClientRkFs-v2.h
+++ b/include/optee_include/OpteeClientRkFs-v2.h
@@ -70,6 +70,7 @@ int tee_supp_rk_fs_init(void);
int tee_supp_rk_fs_process(size_t num_params,
struct tee_ioctl_param *params);
-void OpteeClientRkFsInit(void);
+int OpteeClientRkFsInit(void);
+int check_security_exist(int print_flag);
#endif
diff --git a/include/optee_include/OpteeClientRkFs.h b/include/optee_include/OpteeClientRkFs.h
index d7f68bc277..d70c118c75 100644
--- a/include/optee_include/OpteeClientRkFs.h
+++ b/include/optee_include/OpteeClientRkFs.h
@@ -33,6 +33,8 @@ int tee_supp_rk_fs_init(void);
int tee_supp_rk_fs_process(void *cmd, uint32_t cmd_size);
-void OpteeClientRkFsInit(void);
+int OpteeClientRkFsInit(void);
+
+int check_security_exist(int print_flag);
#endif
diff --git a/include/power/rk8xx_pmic.h b/include/power/rk8xx_pmic.h
index daeebb9665..80bf923732 100644
--- a/include/power/rk8xx_pmic.h
+++ b/include/power/rk8xx_pmic.h
@@ -211,6 +211,7 @@ enum {
#define RK8XX_ON_SOURCE 0xae
#define RK8XX_OFF_SOURCE 0xaf
+#define RK817_BUCK4_CMIN 0xc6
#define RK817_ON_SOURCE 0xf5
#define RK817_OFF_SOURCE 0xf6
diff --git a/include/rk_timer_irq.h b/include/rk_timer_irq.h
index 46133016b3..6de549e281 100644
--- a/include/rk_timer_irq.h
+++ b/include/rk_timer_irq.h
@@ -36,8 +36,13 @@
#define TIMER_BASE (0xFF1C0000 + 0x20) /* TIMER 1 */
#define TIMER_IRQ IRQ_TIMER1
#elif defined(CONFIG_ROCKCHIP_RK3368)
-#define TIMER_BASE (0xFF810000 + 0x20) /* TIMER 1 */
-#define TIMER_IRQ IRQ_TIMER1
+/*
+ * Use timer0 and never change, because timer0 will be used in charge animation
+ * driver to support auto wakeup when system suspend. If core poweroff, PMU only
+ * support timer0(not all timer) as wakeup source.
+ */
+#define TIMER_BASE (0xFF810000 + 0x00) /* TIMER 0 */
+#define TIMER_IRQ IRQ_TIMER0
#elif defined(CONFIG_ROCKCHIP_RK3399)
#define TIMER_BASE (0xFF850000 + 0x20) /* TIMER 1 */
#define TIMER_IRQ IRQ_TIMER1
diff --git a/include/sysmem.h b/include/sysmem.h
index 58de824968..0a5d807f82 100644
--- a/include/sysmem.h
+++ b/include/sysmem.h
@@ -6,12 +6,7 @@
#ifndef _SYSMEM_H
#define _SYSMEM_H
-#include <asm/types.h>
-
-#define MAX_SYSMEM_REGIONS 64
-
-#undef MAX_LMB_REGIONS
-#define MAX_LMB_REGIONS MAX_SYSMEM_REGIONS
+#include <memblk.h>
/*
* CONFIG_SYS_FDT_PAD default value is sync with bootm framework in:
@@ -21,96 +16,84 @@
#define CONFIG_SYS_FDT_PAD 0x3000
#endif
-struct sysmem_property {
- const char *name;
- phys_addr_t base;
- phys_size_t size;
- struct list_head node;
-};
-
struct sysmem {
struct lmb lmb;
struct list_head allocated_head;
- struct list_head reserved_head;
ulong allocated_cnt;
- bool has_init;
+ bool has_initf;
+ bool has_initr;
};
+#ifdef CONFIG_SYSMEM
/**
- * sysmem_init() - Sysmem initialization
+ * sysmem_has_init() - Is sysmem initialized
*
- * @return 0 on success, otherwise error
+ * @return true or false
*/
-int sysmem_init(void);
+bool sysmem_has_init(void);
/**
- * sysmem_add() - Add sysmem region
- *
- * @base: region base address
- * @size: region size
+ * sysmem_init() - Sysmem initialization
*
* @return 0 on success, otherwise error
*/
-int sysmem_add(phys_addr_t base, phys_size_t size);
+int sysmem_init(void);
/**
- * sysmem_reserve() - Reserve sysmem region
- *
- * @name: region name
- * @base: region base address
- * @size: region size
+ * sysmem_initr() - Sysmem initialization after relocation
*
* @return 0 on success, otherwise error
*/
-int sysmem_reserve(const char *name, phys_addr_t base, phys_size_t size);
+int sysmem_initr(void);
/**
* sysmem_alloc() - Alloc sysmem region at anywhere
*
- * @name: region name
+ * @id: memblk id
* @size: region size
*
* @return NULL on error, otherwise the allocated region address ptr
*/
-void *sysmem_alloc(const char *name, phys_size_t size);
+void *sysmem_alloc(enum memblk_id id, phys_size_t size);
/**
- * sysmem_alloc_align() - Alloc sysmem region at anywhere with addr align down
+ * sysmem_alloc_base() - Alloc sysmem region at the expect addr
*
- * @name: region name
+ * @id: memblk id
+ * @base: region base
* @size: region size
- * @align: region base address align (down)
*
* @return NULL on error, otherwise the allocated region address ptr
*/
-void *sysmem_alloc_align(const char *name, phys_size_t size, ulong align);
+void *sysmem_alloc_base(enum memblk_id id, phys_addr_t base, phys_size_t size);
/**
- * sysmem_alloc_base() - Alloc sysmem region at the expect addr
+ * sysmem_alloc_base_by_name() - Alloc sysmem region at the expect addr by name
*
- * @name: region name
+ * @name: memblk name
* @base: region base
* @size: region size
*
* @return NULL on error, otherwise the allocated region address ptr
*/
-void *sysmem_alloc_base(const char *name, phys_addr_t base, phys_size_t size);
+void *sysmem_alloc_base_by_name(const char *name,
+ phys_addr_t base, phys_size_t size);
/**
- * sysmem_alloc_align_base() - Alloc sysmem region at the expect addr with align down
+ * sysmem_fdt_reserve_alloc_base() - Alloc sysmem region at the expect addr by name,
+ * called only for reserve memory from fdt.
*
- * @name: region name
+ * @name: memblk name
* @base: region base
* @size: region size
- * @align: region base address align (down)
*
* @return NULL on error, otherwise the allocated region address ptr
*/
-void *sysmem_alloc_align_base(const char *name, phys_addr_t base,
- phys_size_t size, ulong align);
+void *sysmem_fdt_reserve_alloc_base(const char *name,
+ phys_addr_t base, phys_size_t size);
/**
- * sysmem_free() - Free sysmem region
+ * sysmem_free() - Free allocated sysmem region
*
* @base: region base
*
@@ -119,23 +102,11 @@ void *sysmem_alloc_align_base(const char *name, phys_addr_t base,
int sysmem_free(phys_addr_t base);
/**
- * sysmem_check() - Check sysmem regions
- *
- * @return 0 on okay, otherwise something wrong
- */
-int sysmem_check(void);
-
-/**
- * sysmem_dump_all() - Dump all sysmem stat
+ * sysmem_dump() - Dump all sysmem region state and check overflow
*/
void sysmem_dump(void);
/**
- * sysmem_dump_check() - Dump all sysmem stat and check overflow
- */
-int sysmem_dump_check(void);
-
-/**
* board_sysmem_reserve() - Weak function for board to implement
*
* @sysmem: global sysmem point, ignored
@@ -143,14 +114,29 @@ int sysmem_dump_check(void);
* @return 0 on success, otherwise error
*/
int board_sysmem_reserve(struct sysmem *sysmem);
-
-/**
- * arch_sysmem_reserve() - Weak function for arch to implement
- *
- * @sysmem: global sysmem point, ignored
- *
- * @return 0 on success, otherwise error
- */
-int arch_sysmem_reserve(struct sysmem *sysmem);
-
+#else
+static inline bool sysmem_has_init(void) { return false; }
+static inline int sysmem_init(void) { return 0; }
+static inline int sysmem_initr(void) { return 0; }
+static inline int sysmem_free(phys_addr_t base) { return 0; }
+static inline void sysmem_dump(void) {}
+__weak int board_sysmem_reserve(struct sysmem *sysmem) { return 0; }
+static inline void *sysmem_alloc_base(enum memblk_id id,
+ phys_addr_t base, phys_size_t size)
+{
+ return (void *)base;
+}
+static inline void *sysmem_alloc_base_by_name(const char *name,
+ phys_addr_t base,
+ phys_size_t size)
+{
+ return (void *)base;
+}
+static inline void *sysmem_fdt_reserve_alloc_base(const char *name,
+ phys_addr_t base,
+ phys_size_t size)
+{
+ return (void *)base;
+}
+#endif /* CONFIG_SYSMEM */
#endif /* _SYSMEM_H */
diff --git a/lib/Kconfig b/lib/Kconfig
index 0699984837..c1aca36303 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -105,6 +105,12 @@ config SYSMEM
help
This enables support for system permanent memory management.
+config BIDRAM
+ bool "GD board bi_dram[] memory management"
+ default y
+ help
+ This enables support for GD board bi_dram[] memory management.
+
source lib/dhry/Kconfig
menu "Security support"
diff --git a/lib/Makefile b/lib/Makefile
index e417c794df..30f195b66f 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -31,6 +31,7 @@ obj-y += initcall.o
obj-$(CONFIG_LMB) += lmb.o
ifdef CONFIG_LMB
obj-$(CONFIG_SYSMEM) += sysmem.o
+obj-$(CONFIG_BIDRAM) += bidram.o
endif
obj-y += ldiv.o
obj-$(CONFIG_LZ4) += lz4_wrapper.o
diff --git a/lib/avb/libavb/avb_sysdeps_posix.c b/lib/avb/libavb/avb_sysdeps_posix.c
index 638ce9867a..413ac776eb 100755
--- a/lib/avb/libavb/avb_sysdeps_posix.c
+++ b/lib/avb/libavb/avb_sysdeps_posix.c
@@ -1,90 +1,90 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include <stdio.h>
-#include <common.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <malloc.h>
-#include <errno.h>
-#include <asm/io.h>
-
-#include <android_avb/avb_sysdeps.h>
-
-void abort(void)
-{
-
-}
-int avb_memcmp(const void* src1, const void* src2, size_t n) {
- return memcmp(src1, src2, n);
-}
-
-void* avb_memcpy(void* dest, const void* src, size_t n) {
- return memcpy(dest, src, n);
-}
-
-void* avb_memset(void* dest, const int c, size_t n) {
- return memset(dest, c, n);
-}
-
-int avb_strcmp(const char* s1, const char* s2) {
- return strcmp(s1, s2);
-}
-
-size_t avb_strlen(const char* str) {
- return strlen(str);
-}
-
-void avb_abort(void) {
- abort();
-}
-
-void avb_print(const char* message) {
- fprintf(stderr, "%s", message);
-}
-
-void avb_printv(const char* message, ...) {
- va_list ap;
- const char* m;
-
- va_start(ap, message);
- for (m = message; m != NULL; m = va_arg(ap, const char*)) {
- fprintf(stderr, "%s", m);
- }
- va_end(ap);
-}
-
-void* avb_malloc_(size_t size) {
- return malloc(size);
-}
-
-void avb_free(void* ptr) {
- free(ptr);
-}
-
-uint32_t avb_div_by_10(uint64_t* dividend) {
- uint32_t rem = (uint32_t)(*dividend % 10);
- *dividend /= 10;
- return rem;
-}
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <common.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <errno.h>
+#include <asm/io.h>
+
+#include <android_avb/avb_sysdeps.h>
+
+void abort(void)
+{
+
+}
+int avb_memcmp(const void* src1, const void* src2, size_t n) {
+ return memcmp(src1, src2, n);
+}
+
+void* avb_memcpy(void* dest, const void* src, size_t n) {
+ return memcpy(dest, src, n);
+}
+
+void* avb_memset(void* dest, const int c, size_t n) {
+ return memset(dest, c, n);
+}
+
+int avb_strcmp(const char* s1, const char* s2) {
+ return strcmp(s1, s2);
+}
+
+size_t avb_strlen(const char* str) {
+ return strlen(str);
+}
+
+void avb_abort(void) {
+ abort();
+}
+
+void avb_print(const char* message) {
+ printf("%s", message);
+}
+
+void avb_printv(const char* message, ...) {
+ va_list ap;
+ const char* m;
+
+ va_start(ap, message);
+ for (m = message; m != NULL; m = va_arg(ap, const char*)) {
+ printf("%s", m);
+ }
+ va_end(ap);
+}
+
+void* avb_malloc_(size_t size) {
+ return malloc(size);
+}
+
+void avb_free(void* ptr) {
+ free(ptr);
+}
+
+uint32_t avb_div_by_10(uint64_t* dividend) {
+ uint32_t rem = (uint32_t)(*dividend % 10);
+ *dividend /= 10;
+ return rem;
+}
diff --git a/lib/avb/libavb_ab/avb_ab_flow.c b/lib/avb/libavb_ab/avb_ab_flow.c
index 7ed1ab9107..c84131d6c3 100755
--- a/lib/avb/libavb_ab/avb_ab_flow.c
+++ b/lib/avb/libavb_ab/avb_ab_flow.c
@@ -1,531 +1,532 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include <android_avb/avb_ab_flow.h>
-
-bool avb_ab_data_verify_and_byteswap(const AvbABData* src, AvbABData* dest) {
- /* Ensure magic is correct. */
- if (avb_safe_memcmp(src->magic, AVB_AB_MAGIC, AVB_AB_MAGIC_LEN) != 0) {
- avb_error("Magic is incorrect.\n");
- return false;
- }
-
- avb_memcpy(dest, src, sizeof(AvbABData));
- dest->crc32 = avb_be32toh(dest->crc32);
-
- /* Ensure we don't attempt to access any fields if the major version
- * is not supported.
- */
- if (dest->version_major > AVB_AB_MAJOR_VERSION) {
- avb_error("No support for given major version.\n");
- return false;
- }
-
- /* Bail if CRC32 doesn't match. */
- if (dest->crc32 !=
- avb_crc32((const uint8_t*)dest, sizeof(AvbABData) - sizeof(uint32_t))) {
- avb_error("CRC32 does not match.\n");
- return false;
- }
-
- return true;
-}
-
-void avb_ab_data_update_crc_and_byteswap(const AvbABData* src,
- AvbABData* dest) {
- avb_memcpy(dest, src, sizeof(AvbABData));
- dest->crc32 = avb_htobe32(
- avb_crc32((const uint8_t*)dest, sizeof(AvbABData) - sizeof(uint32_t)));
-}
-
-void avb_ab_data_init(AvbABData* data) {
- avb_memset(data, '\0', sizeof(AvbABData));
- avb_memcpy(data->magic, AVB_AB_MAGIC, AVB_AB_MAGIC_LEN);
- data->version_major = AVB_AB_MAJOR_VERSION;
- data->version_minor = AVB_AB_MINOR_VERSION;
- data->slots[0].priority = AVB_AB_MAX_PRIORITY;
- data->slots[0].tries_remaining = AVB_AB_MAX_TRIES_REMAINING;
- data->slots[0].successful_boot = 0;
- data->slots[1].priority = AVB_AB_MAX_PRIORITY - 1;
- data->slots[1].tries_remaining = AVB_AB_MAX_TRIES_REMAINING;
- data->slots[1].successful_boot = 0;
-}
-
-/* The AvbABData struct is stored 2048 bytes into the 'misc' partition
- * following the 'struct bootloader_message' field. The struct is
- * compatible with the guidelines in bootable/recovery/bootloader.h -
- * e.g. it is stored in the |slot_suffix| field, starts with a
- * NUL-byte, and is 32 bytes long.
- */
-#define AB_METADATA_MISC_PARTITION_OFFSET 2048
-
-AvbIOResult avb_ab_data_read(AvbABOps* ab_ops, AvbABData* data) {
- AvbOps* ops = ab_ops->ops;
- AvbABData serialized;
- AvbIOResult io_ret;
- size_t num_bytes_read;
-
- io_ret = ops->read_from_partition(ops,
- "misc",
- AB_METADATA_MISC_PARTITION_OFFSET,
- sizeof(AvbABData),
- &serialized,
- &num_bytes_read);
- if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
- return AVB_IO_RESULT_ERROR_OOM;
- } else if (io_ret != AVB_IO_RESULT_OK ||
- num_bytes_read != sizeof(AvbABData)) {
- avb_error("Error reading A/B metadata.\n");
- return AVB_IO_RESULT_ERROR_IO;
- }
-
- if (!avb_ab_data_verify_and_byteswap(&serialized, data)) {
- avb_error(
- "Error validating A/B metadata from disk. "
- "Resetting and writing new A/B metadata to disk.\n");
- avb_ab_data_init(data);
- return avb_ab_data_write(ab_ops, data);
- }
-
- return AVB_IO_RESULT_OK;
-}
-
-AvbIOResult avb_ab_data_write(AvbABOps* ab_ops, const AvbABData* data) {
- AvbOps* ops = ab_ops->ops;
- AvbABData serialized;
- AvbIOResult io_ret;
-
- avb_ab_data_update_crc_and_byteswap(data, &serialized);
- io_ret = ops->write_to_partition(ops,
- "misc",
- AB_METADATA_MISC_PARTITION_OFFSET,
- sizeof(AvbABData),
- &serialized);
- if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
- return AVB_IO_RESULT_ERROR_OOM;
- } else if (io_ret != AVB_IO_RESULT_OK) {
- avb_error("Error writing A/B metadata.\n");
- return AVB_IO_RESULT_ERROR_IO;
- }
- return AVB_IO_RESULT_OK;
-}
-
-static bool slot_is_bootable(AvbABSlotData* slot) {
- return slot->priority > 0 &&
- (slot->successful_boot || (slot->tries_remaining > 0));
-}
-
-static void slot_set_unbootable(AvbABSlotData* slot) {
- slot->priority = 0;
- slot->tries_remaining = 0;
- slot->successful_boot = 0;
-}
-
-/* Ensure all unbootable and/or illegal states are marked as the
- * canonical 'unbootable' state, e.g. priority=0, tries_remaining=0,
- * and successful_boot=0.
- */
-static void slot_normalize(AvbABSlotData* slot) {
- if (slot->priority > 0) {
- if (slot->tries_remaining == 0 && !slot->successful_boot) {
- /* We've exhausted all tries -> unbootable. */
- slot_set_unbootable(slot);
- }
- if (slot->tries_remaining > 0 && slot->successful_boot) {
- /* Illegal state - avb_ab_mark_slot_successful() will clear
- * tries_remaining when setting successful_boot.
- */
- slot_set_unbootable(slot);
- }
- } else {
- slot_set_unbootable(slot);
- }
-}
-
-static const char* slot_suffixes[2] = {"_a", "_b"};
-
-/* Helper function to load metadata - returns AVB_IO_RESULT_OK on
- * success, error code otherwise.
- */
-AvbIOResult load_metadata(AvbABOps* ab_ops,
- AvbABData* ab_data,
- AvbABData* ab_data_orig) {
- AvbIOResult io_ret;
-
- io_ret = ab_ops->read_ab_metadata(ab_ops, ab_data);
- if (io_ret != AVB_IO_RESULT_OK) {
- avb_error("I/O error while loading A/B metadata.\n");
- return io_ret;
- }
- *ab_data_orig = *ab_data;
-
- /* Ensure data is normalized, e.g. illegal states will be marked as
- * unbootable and all unbootable states are represented with
- * (priority=0, tries_remaining=0, successful_boot=0).
- */
- slot_normalize(&ab_data->slots[0]);
- slot_normalize(&ab_data->slots[1]);
- return AVB_IO_RESULT_OK;
-}
-
-/* Writes A/B metadata to disk only if it has changed - returns
- * AVB_IO_RESULT_OK on success, error code otherwise.
- */
-AvbIOResult save_metadata_if_changed(AvbABOps* ab_ops,
- AvbABData* ab_data,
- AvbABData* ab_data_orig) {
- if (avb_safe_memcmp(ab_data, ab_data_orig, sizeof(AvbABData)) != 0) {
- avb_debug("Writing A/B metadata to disk.\n");
- return ab_ops->write_ab_metadata(ab_ops, ab_data);
- }
- return AVB_IO_RESULT_OK;
-}
-
-AvbABFlowResult avb_ab_flow(AvbABOps* ab_ops,
- const char* const* requested_partitions,
- AvbSlotVerifyFlags flags,
- AvbHashtreeErrorMode hashtree_error_mode,
- AvbSlotVerifyData** out_data) {
- AvbOps* ops = ab_ops->ops;
- AvbSlotVerifyData* slot_data[2] = {NULL, NULL};
- AvbSlotVerifyData* data = NULL;
- AvbABFlowResult ret;
- AvbABData ab_data, ab_data_orig;
- size_t slot_index_to_boot, n;
- AvbIOResult io_ret;
- bool saw_and_allowed_verification_error = false;
-
- io_ret = load_metadata(ab_ops, &ab_data, &ab_data_orig);
- if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
- ret = AVB_AB_FLOW_RESULT_ERROR_OOM;
- goto out;
- } else if (io_ret != AVB_IO_RESULT_OK) {
- ret = AVB_AB_FLOW_RESULT_ERROR_IO;
- goto out;
- }
-
- /* Validate all bootable slots. */
- for (n = 0; n < 2; n++) {
- if (slot_is_bootable(&ab_data.slots[n])) {
- AvbSlotVerifyResult verify_result;
- bool set_slot_unbootable = false;
-
- verify_result = avb_slot_verify(ops,
- requested_partitions,
- slot_suffixes[n],
- flags,
- hashtree_error_mode,
- &slot_data[n]);
- switch (verify_result) {
- case AVB_SLOT_VERIFY_RESULT_ERROR_OOM:
- ret = AVB_AB_FLOW_RESULT_ERROR_OOM;
- goto out;
-
- case AVB_SLOT_VERIFY_RESULT_ERROR_IO:
- ret = AVB_AB_FLOW_RESULT_ERROR_IO;
- goto out;
-
- case AVB_SLOT_VERIFY_RESULT_OK:
- break;
-
- case AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_METADATA:
- case AVB_SLOT_VERIFY_RESULT_ERROR_UNSUPPORTED_VERSION:
- /* Even with AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR
- * these mean game over.
- */
- set_slot_unbootable = true;
- break;
-
- /* explicit fallthrough. */
- case AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION:
- case AVB_SLOT_VERIFY_RESULT_ERROR_ROLLBACK_INDEX:
- case AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED:
- if (flags & AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR) {
- /* Do nothing since we allow this. */
- avb_debugv("Allowing slot ",
- slot_suffixes[n],
- " which verified "
- "with result ",
- avb_slot_verify_result_to_string(verify_result),
- " because "
- "AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR "
- "is set.\n",
- NULL);
- saw_and_allowed_verification_error = true;
- } else {
- set_slot_unbootable = true;
- }
- break;
-
- case AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_ARGUMENT:
- ret = AVB_AB_FLOW_RESULT_ERROR_INVALID_ARGUMENT;
- goto out;
- /* Do not add a 'default:' case here because of -Wswitch. */
- }
-
- if (set_slot_unbootable) {
- avb_errorv("Error verifying slot ",
- slot_suffixes[n],
- " with result ",
- avb_slot_verify_result_to_string(verify_result),
- " - setting unbootable.\n",
- NULL);
- slot_set_unbootable(&ab_data.slots[n]);
- }
- }
- }
-
- if (slot_is_bootable(&ab_data.slots[0]) &&
- slot_is_bootable(&ab_data.slots[1])) {
- if (ab_data.slots[1].priority > ab_data.slots[0].priority) {
- slot_index_to_boot = 1;
- } else {
- slot_index_to_boot = 0;
- }
- } else if (slot_is_bootable(&ab_data.slots[0])) {
- slot_index_to_boot = 0;
- } else if (slot_is_bootable(&ab_data.slots[1])) {
- slot_index_to_boot = 1;
- } else {
- /* No bootable slots! */
- avb_error("No bootable slots found.\n");
- ret = AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS;
- goto out;
- }
-
- /* Update stored rollback index such that the stored rollback index
- * is the largest value supporting all currently bootable slots. Do
- * this for every rollback index location.
- */
- for (n = 0; n < AVB_MAX_NUMBER_OF_ROLLBACK_INDEX_LOCATIONS; n++) {
- uint64_t rollback_index_value = 0;
-
- if (slot_data[0] != NULL && slot_data[1] != NULL) {
- uint64_t a_rollback_index = slot_data[0]->rollback_indexes[n];
- uint64_t b_rollback_index = slot_data[1]->rollback_indexes[n];
- rollback_index_value =
- (a_rollback_index < b_rollback_index ? a_rollback_index
- : b_rollback_index);
- } else if (slot_data[0] != NULL) {
- rollback_index_value = slot_data[0]->rollback_indexes[n];
- } else if (slot_data[1] != NULL) {
- rollback_index_value = slot_data[1]->rollback_indexes[n];
- }
-
- if (rollback_index_value != 0) {
- uint64_t current_rollback_index_value;
- io_ret = ops->read_rollback_index(ops, n, &current_rollback_index_value);
- if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
- ret = AVB_AB_FLOW_RESULT_ERROR_OOM;
- goto out;
- } else if (io_ret != AVB_IO_RESULT_OK) {
- avb_error("Error getting rollback index for slot.\n");
- ret = AVB_AB_FLOW_RESULT_ERROR_IO;
- goto out;
- }
- if (current_rollback_index_value != rollback_index_value) {
- io_ret = ops->write_rollback_index(ops, n, rollback_index_value);
- if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
- ret = AVB_AB_FLOW_RESULT_ERROR_OOM;
- goto out;
- } else if (io_ret != AVB_IO_RESULT_OK) {
- avb_error("Error setting stored rollback index.\n");
- ret = AVB_AB_FLOW_RESULT_ERROR_IO;
- goto out;
- }
- }
- }
- }
-
- /* Finally, select this slot. */
- avb_assert(slot_data[slot_index_to_boot] != NULL);
- data = slot_data[slot_index_to_boot];
- slot_data[slot_index_to_boot] = NULL;
- if (saw_and_allowed_verification_error) {
- avb_assert(flags & AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR);
- ret = AVB_AB_FLOW_RESULT_OK_WITH_VERIFICATION_ERROR;
- } else {
- ret = AVB_AB_FLOW_RESULT_OK;
- }
-
- /* ... and decrement tries remaining, if applicable. */
- if (!ab_data.slots[slot_index_to_boot].successful_boot &&
- ab_data.slots[slot_index_to_boot].tries_remaining > 0) {
- ab_data.slots[slot_index_to_boot].tries_remaining -= 1;
- }
-
-out:
- io_ret = save_metadata_if_changed(ab_ops, &ab_data, &ab_data_orig);
- if (io_ret != AVB_IO_RESULT_OK) {
- if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
- ret = AVB_AB_FLOW_RESULT_ERROR_OOM;
- } else {
- ret = AVB_AB_FLOW_RESULT_ERROR_IO;
- }
- if (data != NULL) {
- avb_slot_verify_data_free(data);
- data = NULL;
- }
- }
-
- for (n = 0; n < 2; n++) {
- if (slot_data[n] != NULL) {
- avb_slot_verify_data_free(slot_data[n]);
- }
- }
-
- if (out_data != NULL) {
- *out_data = data;
- } else {
- if (data != NULL) {
- avb_slot_verify_data_free(data);
- }
- }
-
- return ret;
-}
-
-AvbIOResult avb_ab_mark_slot_active(AvbABOps* ab_ops,
- unsigned int slot_number) {
- AvbABData ab_data, ab_data_orig;
- unsigned int other_slot_number;
- AvbIOResult ret;
-
- avb_assert(slot_number < 2);
-
- ret = load_metadata(ab_ops, &ab_data, &ab_data_orig);
- if (ret != AVB_IO_RESULT_OK) {
- goto out;
- }
-
- /* Make requested slot top priority, unsuccessful, and with max tries. */
- ab_data.slots[slot_number].priority = AVB_AB_MAX_PRIORITY;
- ab_data.slots[slot_number].tries_remaining = AVB_AB_MAX_TRIES_REMAINING;
- ab_data.slots[slot_number].successful_boot = 0;
-
- /* Ensure other slot doesn't have as high a priority. */
- other_slot_number = 1 - slot_number;
- if (ab_data.slots[other_slot_number].priority == AVB_AB_MAX_PRIORITY) {
- ab_data.slots[other_slot_number].priority = AVB_AB_MAX_PRIORITY - 1;
- }
-
- ret = AVB_IO_RESULT_OK;
-
-out:
- if (ret == AVB_IO_RESULT_OK) {
- ret = save_metadata_if_changed(ab_ops, &ab_data, &ab_data_orig);
- }
- return ret;
-}
-
-AvbIOResult avb_ab_mark_slot_unbootable(AvbABOps* ab_ops,
- unsigned int slot_number) {
- AvbABData ab_data, ab_data_orig;
- AvbIOResult ret;
-
- avb_assert(slot_number < 2);
-
- ret = load_metadata(ab_ops, &ab_data, &ab_data_orig);
- if (ret != AVB_IO_RESULT_OK) {
- goto out;
- }
-
- slot_set_unbootable(&ab_data.slots[slot_number]);
-
- ret = AVB_IO_RESULT_OK;
-
-out:
- if (ret == AVB_IO_RESULT_OK) {
- ret = save_metadata_if_changed(ab_ops, &ab_data, &ab_data_orig);
- }
- return ret;
-}
-
-AvbIOResult avb_ab_mark_slot_successful(AvbABOps* ab_ops,
- unsigned int slot_number) {
- AvbABData ab_data, ab_data_orig;
- AvbIOResult ret;
-
- avb_assert(slot_number < 2);
-
- ret = load_metadata(ab_ops, &ab_data, &ab_data_orig);
- if (ret != AVB_IO_RESULT_OK) {
- goto out;
- }
-
- if (!slot_is_bootable(&ab_data.slots[slot_number])) {
- avb_error("Cannot mark unbootable slot as successful.\n");
- ret = AVB_IO_RESULT_OK;
- goto out;
- }
-
- ab_data.slots[slot_number].tries_remaining = 0;
- ab_data.slots[slot_number].successful_boot = 1;
-
- ret = AVB_IO_RESULT_OK;
-
-out:
- if (ret == AVB_IO_RESULT_OK) {
- ret = save_metadata_if_changed(ab_ops, &ab_data, &ab_data_orig);
- }
- return ret;
-}
-
-const char* avb_ab_flow_result_to_string(AvbABFlowResult result) {
- const char* ret = NULL;
-
- switch (result) {
- case AVB_AB_FLOW_RESULT_OK:
- ret = "OK";
- break;
-
- case AVB_AB_FLOW_RESULT_OK_WITH_VERIFICATION_ERROR:
- ret = "OK_WITH_VERIFICATION_ERROR";
- break;
-
- case AVB_AB_FLOW_RESULT_ERROR_OOM:
- ret = "ERROR_OOM";
- break;
-
- case AVB_AB_FLOW_RESULT_ERROR_IO:
- ret = "ERROR_IO";
- break;
-
- case AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS:
- ret = "ERROR_NO_BOOTABLE_SLOTS";
- break;
-
- case AVB_AB_FLOW_RESULT_ERROR_INVALID_ARGUMENT:
- ret = "ERROR_INVALID_ARGUMENT";
- break;
- /* Do not add a 'default:' case here because of -Wswitch. */
- }
-
- if (ret == NULL) {
- avb_error("Unknown AvbABFlowResult value.\n");
- ret = "(unknown)";
- }
-
- return ret;
-}
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <android_avb/avb_ab_flow.h>
+
+bool avb_ab_data_verify_and_byteswap(const AvbABData* src, AvbABData* dest) {
+ /* Ensure magic is correct. */
+ if (avb_safe_memcmp(src->magic, AVB_AB_MAGIC, AVB_AB_MAGIC_LEN) != 0) {
+ avb_error("Magic is incorrect.\n");
+ return false;
+ }
+
+ avb_memcpy(dest, src, sizeof(AvbABData));
+ dest->crc32 = avb_be32toh(dest->crc32);
+
+ /* Ensure we don't attempt to access any fields if the major version
+ * is not supported.
+ */
+ if (dest->version_major > AVB_AB_MAJOR_VERSION) {
+ avb_error("No support for given major version.\n");
+ return false;
+ }
+
+ /* Bail if CRC32 doesn't match. */
+ if (dest->crc32 !=
+ avb_crc32((const uint8_t*)dest, sizeof(AvbABData) - sizeof(uint32_t))) {
+ avb_error("CRC32 does not match.\n");
+ return false;
+ }
+
+ return true;
+}
+
+void avb_ab_data_update_crc_and_byteswap(const AvbABData* src,
+ AvbABData* dest) {
+ avb_memcpy(dest, src, sizeof(AvbABData));
+ dest->crc32 = avb_htobe32(
+ avb_crc32((const uint8_t*)dest, sizeof(AvbABData) - sizeof(uint32_t)));
+}
+
+void avb_ab_data_init(AvbABData* data) {
+ avb_memset(data, '\0', sizeof(AvbABData));
+ avb_memcpy(data->magic, AVB_AB_MAGIC, AVB_AB_MAGIC_LEN);
+ data->version_major = AVB_AB_MAJOR_VERSION;
+ data->version_minor = AVB_AB_MINOR_VERSION;
+ data->last_boot = 0;
+ data->slots[0].priority = AVB_AB_MAX_PRIORITY;
+ data->slots[0].tries_remaining = AVB_AB_MAX_TRIES_REMAINING;
+ data->slots[0].successful_boot = 0;
+ data->slots[1].priority = AVB_AB_MAX_PRIORITY - 1;
+ data->slots[1].tries_remaining = AVB_AB_MAX_TRIES_REMAINING;
+ data->slots[1].successful_boot = 0;
+}
+
+/* The AvbABData struct is stored 2048 bytes into the 'misc' partition
+ * following the 'struct bootloader_message' field. The struct is
+ * compatible with the guidelines in bootable/recovery/bootloader.h -
+ * e.g. it is stored in the |slot_suffix| field, starts with a
+ * NUL-byte, and is 32 bytes long.
+ */
+#define AB_METADATA_MISC_PARTITION_OFFSET 2048
+
+AvbIOResult avb_ab_data_read(AvbABOps* ab_ops, AvbABData* data) {
+ AvbOps* ops = ab_ops->ops;
+ AvbABData serialized;
+ AvbIOResult io_ret;
+ size_t num_bytes_read;
+
+ io_ret = ops->read_from_partition(ops,
+ "misc",
+ AB_METADATA_MISC_PARTITION_OFFSET,
+ sizeof(AvbABData),
+ &serialized,
+ &num_bytes_read);
+ if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
+ return AVB_IO_RESULT_ERROR_OOM;
+ } else if (io_ret != AVB_IO_RESULT_OK ||
+ num_bytes_read != sizeof(AvbABData)) {
+ avb_error("Error reading A/B metadata.\n");
+ return AVB_IO_RESULT_ERROR_IO;
+ }
+
+ if (!avb_ab_data_verify_and_byteswap(&serialized, data)) {
+ avb_error(
+ "Error validating A/B metadata from disk. "
+ "Resetting and writing new A/B metadata to disk.\n");
+ avb_ab_data_init(data);
+ return avb_ab_data_write(ab_ops, data);
+ }
+
+ return AVB_IO_RESULT_OK;
+}
+
+AvbIOResult avb_ab_data_write(AvbABOps* ab_ops, const AvbABData* data) {
+ AvbOps* ops = ab_ops->ops;
+ AvbABData serialized;
+ AvbIOResult io_ret;
+
+ avb_ab_data_update_crc_and_byteswap(data, &serialized);
+ io_ret = ops->write_to_partition(ops,
+ "misc",
+ AB_METADATA_MISC_PARTITION_OFFSET,
+ sizeof(AvbABData),
+ &serialized);
+ if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
+ return AVB_IO_RESULT_ERROR_OOM;
+ } else if (io_ret != AVB_IO_RESULT_OK) {
+ avb_error("Error writing A/B metadata.\n");
+ return AVB_IO_RESULT_ERROR_IO;
+ }
+ return AVB_IO_RESULT_OK;
+}
+
+static bool slot_is_bootable(AvbABSlotData* slot) {
+ return slot->priority > 0 &&
+ (slot->successful_boot || (slot->tries_remaining > 0));
+}
+
+static void slot_set_unbootable(AvbABSlotData* slot) {
+ slot->priority = 0;
+ slot->tries_remaining = 0;
+ slot->successful_boot = 0;
+}
+
+/* Ensure all unbootable and/or illegal states are marked as the
+ * canonical 'unbootable' state, e.g. priority=0, tries_remaining=0,
+ * and successful_boot=0.
+ */
+static void slot_normalize(AvbABSlotData* slot) {
+ if (slot->priority > 0) {
+ if (slot->tries_remaining == 0 && !slot->successful_boot) {
+ /* We've exhausted all tries -> unbootable. */
+ slot_set_unbootable(slot);
+ }
+ if (slot->tries_remaining > 0 && slot->successful_boot) {
+ /* Illegal state - avb_ab_mark_slot_successful() will clear
+ * tries_remaining when setting successful_boot.
+ */
+ slot_set_unbootable(slot);
+ }
+ } else {
+ slot_set_unbootable(slot);
+ }
+}
+
+static const char* slot_suffixes[2] = {"_a", "_b"};
+
+/* Helper function to load metadata - returns AVB_IO_RESULT_OK on
+ * success, error code otherwise.
+ */
+AvbIOResult load_metadata(AvbABOps* ab_ops,
+ AvbABData* ab_data,
+ AvbABData* ab_data_orig) {
+ AvbIOResult io_ret;
+
+ io_ret = ab_ops->read_ab_metadata(ab_ops, ab_data);
+ if (io_ret != AVB_IO_RESULT_OK) {
+ avb_error("I/O error while loading A/B metadata.\n");
+ return io_ret;
+ }
+ *ab_data_orig = *ab_data;
+
+ /* Ensure data is normalized, e.g. illegal states will be marked as
+ * unbootable and all unbootable states are represented with
+ * (priority=0, tries_remaining=0, successful_boot=0).
+ */
+ slot_normalize(&ab_data->slots[0]);
+ slot_normalize(&ab_data->slots[1]);
+ return AVB_IO_RESULT_OK;
+}
+
+/* Writes A/B metadata to disk only if it has changed - returns
+ * AVB_IO_RESULT_OK on success, error code otherwise.
+ */
+AvbIOResult save_metadata_if_changed(AvbABOps* ab_ops,
+ AvbABData* ab_data,
+ AvbABData* ab_data_orig) {
+ if (avb_safe_memcmp(ab_data, ab_data_orig, sizeof(AvbABData)) != 0) {
+ avb_debug("Writing A/B metadata to disk.\n");
+ return ab_ops->write_ab_metadata(ab_ops, ab_data);
+ }
+ return AVB_IO_RESULT_OK;
+}
+
+AvbABFlowResult avb_ab_flow(AvbABOps* ab_ops,
+ const char* const* requested_partitions,
+ AvbSlotVerifyFlags flags,
+ AvbHashtreeErrorMode hashtree_error_mode,
+ AvbSlotVerifyData** out_data) {
+ AvbOps* ops = ab_ops->ops;
+ AvbSlotVerifyData* slot_data[2] = {NULL, NULL};
+ AvbSlotVerifyData* data = NULL;
+ AvbABFlowResult ret;
+ AvbABData ab_data, ab_data_orig;
+ size_t slot_index_to_boot, n;
+ AvbIOResult io_ret;
+ bool saw_and_allowed_verification_error = false;
+
+ io_ret = load_metadata(ab_ops, &ab_data, &ab_data_orig);
+ if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
+ ret = AVB_AB_FLOW_RESULT_ERROR_OOM;
+ goto out;
+ } else if (io_ret != AVB_IO_RESULT_OK) {
+ ret = AVB_AB_FLOW_RESULT_ERROR_IO;
+ goto out;
+ }
+
+ /* Validate all bootable slots. */
+ for (n = 0; n < 2; n++) {
+ if (slot_is_bootable(&ab_data.slots[n])) {
+ AvbSlotVerifyResult verify_result;
+ bool set_slot_unbootable = false;
+
+ verify_result = avb_slot_verify(ops,
+ requested_partitions,
+ slot_suffixes[n],
+ flags,
+ hashtree_error_mode,
+ &slot_data[n]);
+ switch (verify_result) {
+ case AVB_SLOT_VERIFY_RESULT_ERROR_OOM:
+ ret = AVB_AB_FLOW_RESULT_ERROR_OOM;
+ goto out;
+
+ case AVB_SLOT_VERIFY_RESULT_ERROR_IO:
+ ret = AVB_AB_FLOW_RESULT_ERROR_IO;
+ goto out;
+
+ case AVB_SLOT_VERIFY_RESULT_OK:
+ break;
+
+ case AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_METADATA:
+ case AVB_SLOT_VERIFY_RESULT_ERROR_UNSUPPORTED_VERSION:
+ /* Even with AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR
+ * these mean game over.
+ */
+ set_slot_unbootable = true;
+ break;
+
+ /* explicit fallthrough. */
+ case AVB_SLOT_VERIFY_RESULT_ERROR_VERIFICATION:
+ case AVB_SLOT_VERIFY_RESULT_ERROR_ROLLBACK_INDEX:
+ case AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED:
+ if (flags & AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR) {
+ /* Do nothing since we allow this. */
+ avb_debugv("Allowing slot ",
+ slot_suffixes[n],
+ " which verified "
+ "with result ",
+ avb_slot_verify_result_to_string(verify_result),
+ " because "
+ "AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR "
+ "is set.\n",
+ NULL);
+ saw_and_allowed_verification_error = true;
+ } else {
+ set_slot_unbootable = true;
+ }
+ break;
+
+ case AVB_SLOT_VERIFY_RESULT_ERROR_INVALID_ARGUMENT:
+ ret = AVB_AB_FLOW_RESULT_ERROR_INVALID_ARGUMENT;
+ goto out;
+ /* Do not add a 'default:' case here because of -Wswitch. */
+ }
+
+ if (set_slot_unbootable) {
+ avb_errorv("Error verifying slot ",
+ slot_suffixes[n],
+ " with result ",
+ avb_slot_verify_result_to_string(verify_result),
+ " - setting unbootable.\n",
+ NULL);
+ slot_set_unbootable(&ab_data.slots[n]);
+ }
+ }
+ }
+
+ if (slot_is_bootable(&ab_data.slots[0]) &&
+ slot_is_bootable(&ab_data.slots[1])) {
+ if (ab_data.slots[1].priority > ab_data.slots[0].priority) {
+ slot_index_to_boot = 1;
+ } else {
+ slot_index_to_boot = 0;
+ }
+ } else if (slot_is_bootable(&ab_data.slots[0])) {
+ slot_index_to_boot = 0;
+ } else if (slot_is_bootable(&ab_data.slots[1])) {
+ slot_index_to_boot = 1;
+ } else {
+ /* No bootable slots! */
+ avb_error("No bootable slots found.\n");
+ ret = AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS;
+ goto out;
+ }
+
+ /* Update stored rollback index such that the stored rollback index
+ * is the largest value supporting all currently bootable slots. Do
+ * this for every rollback index location.
+ */
+ for (n = 0; n < AVB_MAX_NUMBER_OF_ROLLBACK_INDEX_LOCATIONS; n++) {
+ uint64_t rollback_index_value = 0;
+
+ if (slot_data[0] != NULL && slot_data[1] != NULL) {
+ uint64_t a_rollback_index = slot_data[0]->rollback_indexes[n];
+ uint64_t b_rollback_index = slot_data[1]->rollback_indexes[n];
+ rollback_index_value =
+ (a_rollback_index < b_rollback_index ? a_rollback_index
+ : b_rollback_index);
+ } else if (slot_data[0] != NULL) {
+ rollback_index_value = slot_data[0]->rollback_indexes[n];
+ } else if (slot_data[1] != NULL) {
+ rollback_index_value = slot_data[1]->rollback_indexes[n];
+ }
+
+ if (rollback_index_value != 0) {
+ uint64_t current_rollback_index_value;
+ io_ret = ops->read_rollback_index(ops, n, &current_rollback_index_value);
+ if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
+ ret = AVB_AB_FLOW_RESULT_ERROR_OOM;
+ goto out;
+ } else if (io_ret != AVB_IO_RESULT_OK) {
+ avb_error("Error getting rollback index for slot.\n");
+ ret = AVB_AB_FLOW_RESULT_ERROR_IO;
+ goto out;
+ }
+ if (current_rollback_index_value != rollback_index_value) {
+ io_ret = ops->write_rollback_index(ops, n, rollback_index_value);
+ if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
+ ret = AVB_AB_FLOW_RESULT_ERROR_OOM;
+ goto out;
+ } else if (io_ret != AVB_IO_RESULT_OK) {
+ avb_error("Error setting stored rollback index.\n");
+ ret = AVB_AB_FLOW_RESULT_ERROR_IO;
+ goto out;
+ }
+ }
+ }
+ }
+
+ /* Finally, select this slot. */
+ avb_assert(slot_data[slot_index_to_boot] != NULL);
+ data = slot_data[slot_index_to_boot];
+ slot_data[slot_index_to_boot] = NULL;
+ if (saw_and_allowed_verification_error) {
+ avb_assert(flags & AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR);
+ ret = AVB_AB_FLOW_RESULT_OK_WITH_VERIFICATION_ERROR;
+ } else {
+ ret = AVB_AB_FLOW_RESULT_OK;
+ }
+
+ /* ... and decrement tries remaining, if applicable. */
+ if (!ab_data.slots[slot_index_to_boot].successful_boot &&
+ ab_data.slots[slot_index_to_boot].tries_remaining > 0) {
+ ab_data.slots[slot_index_to_boot].tries_remaining -= 1;
+ }
+
+out:
+ io_ret = save_metadata_if_changed(ab_ops, &ab_data, &ab_data_orig);
+ if (io_ret != AVB_IO_RESULT_OK) {
+ if (io_ret == AVB_IO_RESULT_ERROR_OOM) {
+ ret = AVB_AB_FLOW_RESULT_ERROR_OOM;
+ } else {
+ ret = AVB_AB_FLOW_RESULT_ERROR_IO;
+ }
+ if (data != NULL) {
+ avb_slot_verify_data_free(data);
+ data = NULL;
+ }
+ }
+
+ for (n = 0; n < 2; n++) {
+ if (slot_data[n] != NULL) {
+ avb_slot_verify_data_free(slot_data[n]);
+ }
+ }
+
+ if (out_data != NULL) {
+ *out_data = data;
+ } else {
+ if (data != NULL) {
+ avb_slot_verify_data_free(data);
+ }
+ }
+
+ return ret;
+}
+
+AvbIOResult avb_ab_mark_slot_active(AvbABOps* ab_ops,
+ unsigned int slot_number) {
+ AvbABData ab_data, ab_data_orig;
+ unsigned int other_slot_number;
+ AvbIOResult ret;
+
+ avb_assert(slot_number < 2);
+
+ ret = load_metadata(ab_ops, &ab_data, &ab_data_orig);
+ if (ret != AVB_IO_RESULT_OK) {
+ goto out;
+ }
+
+ /* Make requested slot top priority, unsuccessful, and with max tries. */
+ ab_data.slots[slot_number].priority = AVB_AB_MAX_PRIORITY;
+ ab_data.slots[slot_number].tries_remaining = AVB_AB_MAX_TRIES_REMAINING;
+ ab_data.slots[slot_number].successful_boot = 0;
+
+ /* Ensure other slot doesn't have as high a priority. */
+ other_slot_number = 1 - slot_number;
+ if (ab_data.slots[other_slot_number].priority == AVB_AB_MAX_PRIORITY) {
+ ab_data.slots[other_slot_number].priority = AVB_AB_MAX_PRIORITY - 1;
+ }
+
+ ret = AVB_IO_RESULT_OK;
+
+out:
+ if (ret == AVB_IO_RESULT_OK) {
+ ret = save_metadata_if_changed(ab_ops, &ab_data, &ab_data_orig);
+ }
+ return ret;
+}
+
+AvbIOResult avb_ab_mark_slot_unbootable(AvbABOps* ab_ops,
+ unsigned int slot_number) {
+ AvbABData ab_data, ab_data_orig;
+ AvbIOResult ret;
+
+ avb_assert(slot_number < 2);
+
+ ret = load_metadata(ab_ops, &ab_data, &ab_data_orig);
+ if (ret != AVB_IO_RESULT_OK) {
+ goto out;
+ }
+
+ slot_set_unbootable(&ab_data.slots[slot_number]);
+
+ ret = AVB_IO_RESULT_OK;
+
+out:
+ if (ret == AVB_IO_RESULT_OK) {
+ ret = save_metadata_if_changed(ab_ops, &ab_data, &ab_data_orig);
+ }
+ return ret;
+}
+
+AvbIOResult avb_ab_mark_slot_successful(AvbABOps* ab_ops,
+ unsigned int slot_number) {
+ AvbABData ab_data, ab_data_orig;
+ AvbIOResult ret;
+
+ avb_assert(slot_number < 2);
+
+ ret = load_metadata(ab_ops, &ab_data, &ab_data_orig);
+ if (ret != AVB_IO_RESULT_OK) {
+ goto out;
+ }
+
+ if (!slot_is_bootable(&ab_data.slots[slot_number])) {
+ avb_error("Cannot mark unbootable slot as successful.\n");
+ ret = AVB_IO_RESULT_OK;
+ goto out;
+ }
+
+ ab_data.slots[slot_number].tries_remaining = 0;
+ ab_data.slots[slot_number].successful_boot = 1;
+
+ ret = AVB_IO_RESULT_OK;
+
+out:
+ if (ret == AVB_IO_RESULT_OK) {
+ ret = save_metadata_if_changed(ab_ops, &ab_data, &ab_data_orig);
+ }
+ return ret;
+}
+
+const char* avb_ab_flow_result_to_string(AvbABFlowResult result) {
+ const char* ret = NULL;
+
+ switch (result) {
+ case AVB_AB_FLOW_RESULT_OK:
+ ret = "OK";
+ break;
+
+ case AVB_AB_FLOW_RESULT_OK_WITH_VERIFICATION_ERROR:
+ ret = "OK_WITH_VERIFICATION_ERROR";
+ break;
+
+ case AVB_AB_FLOW_RESULT_ERROR_OOM:
+ ret = "ERROR_OOM";
+ break;
+
+ case AVB_AB_FLOW_RESULT_ERROR_IO:
+ ret = "ERROR_IO";
+ break;
+
+ case AVB_AB_FLOW_RESULT_ERROR_NO_BOOTABLE_SLOTS:
+ ret = "ERROR_NO_BOOTABLE_SLOTS";
+ break;
+
+ case AVB_AB_FLOW_RESULT_ERROR_INVALID_ARGUMENT:
+ ret = "ERROR_INVALID_ARGUMENT";
+ break;
+ /* Do not add a 'default:' case here because of -Wswitch. */
+ }
+
+ if (ret == NULL) {
+ avb_error("Unknown AvbABFlowResult value.\n");
+ ret = "(unknown)";
+ }
+
+ return ret;
+}
diff --git a/lib/avb/libavb_atx/avb_atx_validate.c b/lib/avb/libavb_atx/avb_atx_validate.c
index 74a34fd0fd..9695d1b17a 100755..100644
--- a/lib/avb/libavb_atx/avb_atx_validate.c
+++ b/lib/avb/libavb_atx/avb_atx_validate.c
@@ -1,401 +1,473 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include <android_avb/avb_atx_validate.h>
-
-#include <android_avb/avb_rsa.h>
-#include <android_avb/avb_sha.h>
-#include <android_avb/avb_sysdeps.h>
-#include <android_avb/avb_util.h>
-
-/* The most recent unlock challenge generated. */
-static uint8_t last_unlock_challenge[AVB_ATX_UNLOCK_CHALLENGE_SIZE];
-
-/* Computes the SHA256 |hash| of |length| bytes of |data|. */
-static void sha256(const uint8_t* data,
- uint32_t length,
- uint8_t hash[AVB_SHA256_DIGEST_SIZE]) {
- AvbSHA256Ctx context;
- avb_sha256_init(&context);
- avb_sha256_update(&context, data, length);
- uint8_t* tmp = avb_sha256_final(&context);
- avb_memcpy(hash, tmp, AVB_SHA256_DIGEST_SIZE);
-}
-
-/* Computes the SHA512 |hash| of |length| bytes of |data|. */
-static void sha512(const uint8_t* data,
- uint32_t length,
- uint8_t hash[AVB_SHA512_DIGEST_SIZE]) {
- AvbSHA512Ctx context;
- avb_sha512_init(&context);
- avb_sha512_update(&context, data, length);
- uint8_t* tmp = avb_sha512_final(&context);
- avb_memcpy(hash, tmp, AVB_SHA512_DIGEST_SIZE);
-}
-
-/* Computes the SHA256 |hash| of a NUL-terminated |str|. */
-static void sha256_str(const char* str, uint8_t hash[AVB_SHA256_DIGEST_SIZE]) {
- sha256((const uint8_t*)str, avb_strlen(str), hash);
-}
-
-/* Verifies structure and |expected_hash| of permanent |attributes|. */
-static bool verify_permanent_attributes(
- const AvbAtxPermanentAttributes* attributes,
- const uint8_t expected_hash[AVB_SHA256_DIGEST_SIZE]) {
- uint8_t hash[AVB_SHA256_DIGEST_SIZE];
-
- if (attributes->version != 1) {
- avb_error("Unsupported permanent attributes version.\n");
- return false;
- }
- sha256((const uint8_t*)attributes, sizeof(AvbAtxPermanentAttributes), hash);
- if (0 != avb_safe_memcmp(hash, expected_hash, AVB_SHA256_DIGEST_SIZE)) {
- avb_error("Invalid permanent attributes.\n");
- return false;
- }
- return true;
-}
-
-/* Verifies the format, key version, usage, and signature of a certificate. */
-static bool verify_certificate(
- const AvbAtxCertificate* certificate,
- const uint8_t authority[AVB_ATX_PUBLIC_KEY_SIZE],
- uint64_t minimum_key_version,
- const uint8_t expected_usage[AVB_SHA256_DIGEST_SIZE]) {
- const AvbAlgorithmData* algorithm_data;
- uint8_t certificate_hash[AVB_SHA512_DIGEST_SIZE];
-
- if (certificate->signed_data.version != 1) {
- avb_error("Unsupported certificate format.\n");
- return false;
- }
- algorithm_data = avb_get_algorithm_data(AVB_ALGORITHM_TYPE_SHA512_RSA4096);
- sha512((const uint8_t*)&certificate->signed_data,
- sizeof(AvbAtxCertificateSignedData),
- certificate_hash);
- if (!avb_rsa_verify(authority,
- AVB_ATX_PUBLIC_KEY_SIZE,
- certificate->signature,
- AVB_RSA4096_NUM_BYTES,
- certificate_hash,
- AVB_SHA512_DIGEST_SIZE,
- algorithm_data->padding,
- algorithm_data->padding_len)) {
- avb_error("Invalid certificate signature.\n");
- return false;
- }
- if (certificate->signed_data.key_version < minimum_key_version) {
- avb_error("Key rollback detected.\n");
- return false;
- }
- if (0 != avb_safe_memcmp(certificate->signed_data.usage,
- expected_usage,
- AVB_SHA256_DIGEST_SIZE)) {
- avb_error("Invalid certificate usage.\n");
- return false;
- }
- return true;
-}
-
-/* Verifies signature and fields of a PIK certificate. */
-static bool verify_pik_certificate(
- const AvbAtxCertificate* certificate,
- const uint8_t authority[AVB_ATX_PUBLIC_KEY_SIZE],
- uint64_t minimum_version) {
- uint8_t expected_usage[AVB_SHA256_DIGEST_SIZE];
-
- sha256_str("com.google.android.things.vboot.ca", expected_usage);
- if (!verify_certificate(
- certificate, authority, minimum_version, expected_usage)) {
- avb_error("Invalid PIK certificate.\n");
- return false;
- }
- return true;
-}
-
-/* Verifies signature and fields of a PSK certificate. */
-static bool verify_psk_certificate(
- const AvbAtxCertificate* certificate,
- const uint8_t authority[AVB_ATX_PUBLIC_KEY_SIZE],
- uint64_t minimum_version,
- const uint8_t product_id[AVB_ATX_PRODUCT_ID_SIZE]) {
- uint8_t expected_subject[AVB_SHA256_DIGEST_SIZE];
- uint8_t expected_usage[AVB_SHA256_DIGEST_SIZE];
-
- sha256_str("com.google.android.things.vboot", expected_usage);
- if (!verify_certificate(
- certificate, authority, minimum_version, expected_usage)) {
- avb_error("Invalid PSK certificate.\n");
- return false;
- }
- sha256(product_id, AVB_ATX_PRODUCT_ID_SIZE, expected_subject);
- if (0 != avb_safe_memcmp(certificate->signed_data.subject,
- expected_subject,
- AVB_SHA256_DIGEST_SIZE)) {
- avb_error("PSK: Product ID mismatch.\n");
- return false;
- }
- return true;
-}
-
-/* Verifies signature and fields of a PUK certificate. */
-static bool verify_puk_certificate(
- const AvbAtxCertificate* certificate,
- const uint8_t authority[AVB_ATX_PUBLIC_KEY_SIZE],
- uint64_t minimum_version,
- const uint8_t product_id[AVB_ATX_PRODUCT_ID_SIZE]) {
- uint8_t expected_subject[AVB_SHA256_DIGEST_SIZE];
- uint8_t expected_usage[AVB_SHA256_DIGEST_SIZE];
-
- sha256_str("com.google.android.things.vboot.unlock", expected_usage);
- if (!verify_certificate(
- certificate, authority, minimum_version, expected_usage)) {
- avb_error("Invalid PUK certificate.\n");
- return false;
- }
- sha256(product_id, AVB_ATX_PRODUCT_ID_SIZE, expected_subject);
- if (0 != avb_safe_memcmp(certificate->signed_data.subject,
- expected_subject,
- AVB_SHA256_DIGEST_SIZE)) {
- avb_error("PUK: Product ID mismatch.\n");
- return false;
- }
- return true;
-}
-
-AvbIOResult avb_atx_validate_vbmeta_public_key(
- AvbOps* ops,
- const uint8_t* public_key_data,
- size_t public_key_length,
- const uint8_t* public_key_metadata,
- size_t public_key_metadata_length,
- bool* out_is_trusted) {
- AvbIOResult result = AVB_IO_RESULT_OK;
- AvbAtxPermanentAttributes permanent_attributes;
- uint8_t permanent_attributes_hash[AVB_SHA256_DIGEST_SIZE];
- AvbAtxPublicKeyMetadata metadata;
- uint64_t minimum_version;
-
- /* Be pessimistic so we can exit early without having to remember to clear.
- */
- *out_is_trusted = false;
-
- /* Read and verify permanent attributes. */
- result = ops->atx_ops->read_permanent_attributes(ops->atx_ops,
- &permanent_attributes);
- if (result != AVB_IO_RESULT_OK) {
- avb_error("Failed to read permanent attributes.\n");
- return result;
- }
- result = ops->atx_ops->read_permanent_attributes_hash(
- ops->atx_ops, permanent_attributes_hash);
- if (result != AVB_IO_RESULT_OK) {
- avb_error("Failed to read permanent attributes hash.\n");
- return result;
- }
- if (!verify_permanent_attributes(&permanent_attributes,
- permanent_attributes_hash)) {
- return AVB_IO_RESULT_OK;
- }
-
- /* Sanity check public key metadata. */
- if (public_key_metadata_length != sizeof(AvbAtxPublicKeyMetadata)) {
- avb_error("Invalid public key metadata.\n");
- return AVB_IO_RESULT_OK;
- }
- avb_memcpy(&metadata, public_key_metadata, sizeof(AvbAtxPublicKeyMetadata));
- if (metadata.version != 1) {
- avb_error("Unsupported public key metadata.\n");
- return AVB_IO_RESULT_OK;
- }
-
- /* Verify the PIK certificate. */
- result = ops->read_rollback_index(
- ops, AVB_ATX_PIK_VERSION_LOCATION, &minimum_version);
- if (result != AVB_IO_RESULT_OK) {
- avb_error("Failed to read PIK minimum version.\n");
- return result;
- }
- if (!verify_pik_certificate(&metadata.product_intermediate_key_certificate,
- permanent_attributes.product_root_public_key,
- minimum_version)) {
- return AVB_IO_RESULT_OK;
- }
-
- /* Verify the PSK certificate. */
- result = ops->read_rollback_index(
- ops, AVB_ATX_PSK_VERSION_LOCATION, &minimum_version);
- if (result != AVB_IO_RESULT_OK) {
- avb_error("Failed to read PSK minimum version.\n");
- return result;
- }
- if (!verify_psk_certificate(
- &metadata.product_signing_key_certificate,
- metadata.product_intermediate_key_certificate.signed_data.public_key,
- minimum_version,
- permanent_attributes.product_id)) {
- return AVB_IO_RESULT_OK;
- }
-
- /* Verify the PSK is the same key that verified vbmeta. */
- if (public_key_length != AVB_ATX_PUBLIC_KEY_SIZE) {
- avb_error("Public key length mismatch.\n");
- return AVB_IO_RESULT_OK;
- }
- if (0 != avb_safe_memcmp(
- metadata.product_signing_key_certificate.signed_data.public_key,
- public_key_data,
- AVB_ATX_PUBLIC_KEY_SIZE)) {
- avb_error("Public key mismatch.\n");
- return AVB_IO_RESULT_OK;
- }
-
- /* Report the key versions used during verification. */
- ops->atx_ops->set_key_version(
- ops->atx_ops,
- AVB_ATX_PIK_VERSION_LOCATION,
- metadata.product_intermediate_key_certificate.signed_data.key_version);
- ops->atx_ops->set_key_version(
- ops->atx_ops,
- AVB_ATX_PSK_VERSION_LOCATION,
- metadata.product_signing_key_certificate.signed_data.key_version);
-
- *out_is_trusted = true;
- return AVB_IO_RESULT_OK;
-}
-
-AvbIOResult avb_atx_generate_unlock_challenge(
- AvbAtxOps* atx_ops, AvbAtxUnlockChallenge* out_unlock_challenge) {
- AvbIOResult result = AVB_IO_RESULT_OK;
- AvbAtxPermanentAttributes permanent_attributes;
-
- /* We need the permanent attributes to compute the product_id_hash. */
- result = atx_ops->read_permanent_attributes(atx_ops, &permanent_attributes);
- if (result != AVB_IO_RESULT_OK) {
- avb_error("Failed to read permanent attributes.\n");
- return result;
- }
- result = atx_ops->get_random(
- atx_ops, AVB_ATX_UNLOCK_CHALLENGE_SIZE, last_unlock_challenge);
- if (result != AVB_IO_RESULT_OK) {
- avb_error("Failed to generate random challenge.\n");
- return result;
- }
- out_unlock_challenge->version = 1;
- sha256(permanent_attributes.product_id,
- AVB_ATX_PRODUCT_ID_SIZE,
- out_unlock_challenge->product_id_hash);
- avb_memcpy(out_unlock_challenge->challenge,
- last_unlock_challenge,
- AVB_ATX_UNLOCK_CHALLENGE_SIZE);
- return result;
-}
-
-AvbIOResult avb_atx_validate_unlock_credential(
- AvbAtxOps* atx_ops,
- const AvbAtxUnlockCredential* unlock_credential,
- bool* out_is_trusted) {
- AvbIOResult result = AVB_IO_RESULT_OK;
- AvbAtxPermanentAttributes permanent_attributes;
- uint8_t permanent_attributes_hash[AVB_SHA256_DIGEST_SIZE];
- uint64_t minimum_version;
- const AvbAlgorithmData* algorithm_data;
- uint8_t challenge_hash[AVB_SHA512_DIGEST_SIZE];
-
- /* Be pessimistic so we can exit early without having to remember to clear.
- */
- *out_is_trusted = false;
-
- /* Sanity check the credential. */
- if (unlock_credential->version != 1) {
- avb_error("Unsupported unlock credential format.\n");
- return AVB_IO_RESULT_OK;
- }
-
- /* Read and verify permanent attributes. */
- result = atx_ops->read_permanent_attributes(atx_ops, &permanent_attributes);
- if (result != AVB_IO_RESULT_OK) {
- avb_error("Failed to read permanent attributes.\n");
- return result;
- }
- result = atx_ops->read_permanent_attributes_hash(atx_ops,
- permanent_attributes_hash);
- if (result != AVB_IO_RESULT_OK) {
- avb_error("Failed to read permanent attributes hash.\n");
- return result;
- }
- if (!verify_permanent_attributes(&permanent_attributes,
- permanent_attributes_hash)) {
- return AVB_IO_RESULT_OK;
- }
-
- /* Verify the PIK certificate. */
- result = atx_ops->ops->read_rollback_index(
- atx_ops->ops, AVB_ATX_PIK_VERSION_LOCATION, &minimum_version);
- if (result != AVB_IO_RESULT_OK) {
- avb_error("Failed to read PIK minimum version.\n");
- return result;
- }
- if (!verify_pik_certificate(
- &unlock_credential->product_intermediate_key_certificate,
- permanent_attributes.product_root_public_key,
- minimum_version)) {
- return AVB_IO_RESULT_OK;
- }
-
- /* Verify the PUK certificate. The minimum version is shared with the PSK. */
- result = atx_ops->ops->read_rollback_index(
- atx_ops->ops, AVB_ATX_PSK_VERSION_LOCATION, &minimum_version);
- if (result != AVB_IO_RESULT_OK) {
- avb_error("Failed to read PSK minimum version.\n");
- return result;
- }
- if (!verify_puk_certificate(
- &unlock_credential->product_unlock_key_certificate,
- unlock_credential->product_intermediate_key_certificate.signed_data
- .public_key,
- minimum_version,
- permanent_attributes.product_id)) {
- return AVB_IO_RESULT_OK;
- }
-
- /* Verify the challenge signature. */
- algorithm_data = avb_get_algorithm_data(AVB_ALGORITHM_TYPE_SHA512_RSA4096);
- sha512(last_unlock_challenge, AVB_ATX_UNLOCK_CHALLENGE_SIZE, challenge_hash);
- if (!avb_rsa_verify(unlock_credential->product_unlock_key_certificate
- .signed_data.public_key,
- AVB_ATX_PUBLIC_KEY_SIZE,
- unlock_credential->challenge_signature,
- AVB_RSA4096_NUM_BYTES,
- challenge_hash,
- AVB_SHA512_DIGEST_SIZE,
- algorithm_data->padding,
- algorithm_data->padding_len)) {
- avb_error("Invalid unlock challenge signature.\n");
- return AVB_IO_RESULT_OK;
- }
-
- *out_is_trusted = true;
- return AVB_IO_RESULT_OK;
-}
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <android_avb/avb_atx_validate.h>
+
+#include <android_avb/avb_rsa.h>
+#include <android_avb/avb_sha.h>
+#include <android_avb/avb_sysdeps.h>
+#include <android_avb/avb_util.h>
+#include <android_avb/avb_ops_user.h>
+#include <android_avb/rk_avb_ops_user.h>
+#include <malloc.h>
+#include <common.h>
+#ifdef CONFIG_CRYPTO_ROCKCHIP
+#include <rockchip_crypto/rockchip_crypto.h>
+#endif
+
+/* The most recent unlock challenge generated. */
+static uint8_t last_unlock_challenge[AVB_ATX_UNLOCK_CHALLENGE_SIZE];
+
+/* Computes the SHA256 |hash| of |length| bytes of |data|. */
+static void sha256(const uint8_t* data,
+ uint32_t length,
+ uint8_t hash[AVB_SHA256_DIGEST_SIZE]) {
+ AvbSHA256Ctx context;
+ avb_sha256_init(&context);
+ avb_sha256_update(&context, data, length);
+ uint8_t* tmp = avb_sha256_final(&context);
+ avb_memcpy(hash, tmp, AVB_SHA256_DIGEST_SIZE);
+}
+
+/* Computes the SHA512 |hash| of |length| bytes of |data|. */
+static void sha512(const uint8_t* data,
+ uint32_t length,
+ uint8_t hash[AVB_SHA512_DIGEST_SIZE]) {
+ AvbSHA512Ctx context;
+ avb_sha512_init(&context);
+ avb_sha512_update(&context, data, length);
+ uint8_t* tmp = avb_sha512_final(&context);
+ avb_memcpy(hash, tmp, AVB_SHA512_DIGEST_SIZE);
+}
+
+/* Computes the SHA256 |hash| of a NUL-terminated |str|. */
+static void sha256_str(const char* str, uint8_t hash[AVB_SHA256_DIGEST_SIZE]) {
+ sha256((const uint8_t*)str, avb_strlen(str), hash);
+}
+
+/* Verifies structure and |expected_hash| of permanent |attributes|. */
+static bool verify_permanent_attributes(
+ const AvbAtxPermanentAttributes* attributes,
+ const uint8_t expected_hash[AVB_SHA256_DIGEST_SIZE]) {
+ uint8_t hash[AVB_SHA256_DIGEST_SIZE];
+#ifdef CONFIG_ROCKCHIP_PRELOADER_PUB_KEY
+#ifdef CONFIG_CRYPTO_ROCKCHIP
+ struct rk_pub_key pub_key;
+ int i;
+ uint8_t rsa_hash[256] = {0};
+ uint8_t rsa_hash_revert[256] = {0};
+ unsigned int rsaResult_temp[8];
+ unsigned char rsaResult[32] = {0};
+ char *temp;
+ struct rk_crypto_desc crypto_desc;
+ int ret = 0;
+
+ if (rk_crypto_probe())
+ return false;
+
+ memset(&pub_key, 0, sizeof(struct rk_pub_key));
+ ret = rk_avb_get_pub_key(&pub_key);
+ if (ret)
+ return false;
+
+ ret = rk_avb_get_perm_attr_cer(rsa_hash, 256);
+ if (ret) {
+ avb_error("get_perm_attr_cer error\n");
+ return false;
+ }
+
+ for (i = 0; i < 256; i++)
+ rsa_hash_revert[255-i] = rsa_hash[i];
+
+ ret = get_rk_crypto_desc(&crypto_desc);
+ if (ret) {
+ avb_error("get_rk_crypto_desc error\n");
+ return false;
+ }
+
+ ret = rk_crypto_rsa_init(&crypto_desc);
+ if (ret) {
+ avb_error("rk_crypto_rsa_init error\n");
+ return false;
+ }
+
+ ret = rk_crypto_rsa_start(&crypto_desc, (u32 *)(rsa_hash_revert),
+ pub_key.rsa_n, pub_key.rsa_e, pub_key.rsa_c);
+ if (ret) {
+ avb_error("rk_crypto_rsa_start error\n");
+ return false;
+ }
+
+ ret = rk_crypto_rsa_end(&crypto_desc, rsaResult_temp);
+ if (ret) {
+ avb_error("rk_crypto_rsa_end error\n");
+ return false;
+ }
+
+ temp = (char *)rsaResult_temp;
+ for (i = 0; i < 32; i++)
+ rsaResult[31-i] = temp[i];
+
+ sha256((const uint8_t*)attributes, sizeof(AvbAtxPermanentAttributes), hash);
+ if (memcmp((void*)rsaResult, (void*)hash, 32) == 0)
+ return true;
+
+ return false;
+#endif
+#else
+ if (attributes->version != 1) {
+ avb_error("Unsupported permanent attributes version.\n");
+ return false;
+ }
+ sha256((const uint8_t*)attributes, sizeof(AvbAtxPermanentAttributes), hash);
+ if (0 != avb_safe_memcmp(hash, expected_hash, AVB_SHA256_DIGEST_SIZE)) {
+ avb_error("Invalid permanent attributes.\n");
+ return false;
+ }
+ return true;
+#endif
+}
+
+/* Verifies the format, key version, usage, and signature of a certificate. */
+static bool verify_certificate(
+ const AvbAtxCertificate* certificate,
+ const uint8_t authority[AVB_ATX_PUBLIC_KEY_SIZE],
+ uint64_t minimum_key_version,
+ const uint8_t expected_usage[AVB_SHA256_DIGEST_SIZE]) {
+ const AvbAlgorithmData* algorithm_data;
+ uint8_t certificate_hash[AVB_SHA512_DIGEST_SIZE];
+
+ if (certificate->signed_data.version != 1) {
+ avb_error("Unsupported certificate format.\n");
+ return false;
+ }
+ algorithm_data = avb_get_algorithm_data(AVB_ALGORITHM_TYPE_SHA512_RSA4096);
+ sha512((const uint8_t*)&certificate->signed_data,
+ sizeof(AvbAtxCertificateSignedData),
+ certificate_hash);
+ if (!avb_rsa_verify(authority,
+ AVB_ATX_PUBLIC_KEY_SIZE,
+ certificate->signature,
+ AVB_RSA4096_NUM_BYTES,
+ certificate_hash,
+ AVB_SHA512_DIGEST_SIZE,
+ algorithm_data->padding,
+ algorithm_data->padding_len)) {
+ avb_error("Invalid certificate signature.\n");
+ return false;
+ }
+ if (certificate->signed_data.key_version < minimum_key_version) {
+ avb_error("Key rollback detected.\n");
+ return false;
+ }
+ if (0 != avb_safe_memcmp(certificate->signed_data.usage,
+ expected_usage,
+ AVB_SHA256_DIGEST_SIZE)) {
+ avb_error("Invalid certificate usage.\n");
+ return false;
+ }
+ return true;
+}
+
+/* Verifies signature and fields of a PIK certificate. */
+static bool verify_pik_certificate(
+ const AvbAtxCertificate* certificate,
+ const uint8_t authority[AVB_ATX_PUBLIC_KEY_SIZE],
+ uint64_t minimum_version) {
+ uint8_t expected_usage[AVB_SHA256_DIGEST_SIZE];
+
+ sha256_str("com.google.android.things.vboot.ca", expected_usage);
+ if (!verify_certificate(
+ certificate, authority, minimum_version, expected_usage)) {
+ avb_error("Invalid PIK certificate.\n");
+ return false;
+ }
+ return true;
+}
+
+/* Verifies signature and fields of a PSK certificate. */
+static bool verify_psk_certificate(
+ const AvbAtxCertificate* certificate,
+ const uint8_t authority[AVB_ATX_PUBLIC_KEY_SIZE],
+ uint64_t minimum_version,
+ const uint8_t product_id[AVB_ATX_PRODUCT_ID_SIZE]) {
+ uint8_t expected_subject[AVB_SHA256_DIGEST_SIZE];
+ uint8_t expected_usage[AVB_SHA256_DIGEST_SIZE];
+
+ sha256_str("com.google.android.things.vboot", expected_usage);
+ if (!verify_certificate(
+ certificate, authority, minimum_version, expected_usage)) {
+ avb_error("Invalid PSK certificate.\n");
+ return false;
+ }
+ sha256(product_id, AVB_ATX_PRODUCT_ID_SIZE, expected_subject);
+ if (0 != avb_safe_memcmp(certificate->signed_data.subject,
+ expected_subject,
+ AVB_SHA256_DIGEST_SIZE)) {
+ avb_error("PSK: Product ID mismatch.\n");
+ return false;
+ }
+ return true;
+}
+
+/* Verifies signature and fields of a PUK certificate. */
+static bool verify_puk_certificate(
+ const AvbAtxCertificate* certificate,
+ const uint8_t authority[AVB_ATX_PUBLIC_KEY_SIZE],
+ uint64_t minimum_version,
+ const uint8_t product_id[AVB_ATX_PRODUCT_ID_SIZE]) {
+ uint8_t expected_subject[AVB_SHA256_DIGEST_SIZE];
+ uint8_t expected_usage[AVB_SHA256_DIGEST_SIZE];
+
+ sha256_str("com.google.android.things.vboot.unlock", expected_usage);
+ if (!verify_certificate(
+ certificate, authority, minimum_version, expected_usage)) {
+ avb_error("Invalid PUK certificate.\n");
+ return false;
+ }
+ sha256(product_id, AVB_ATX_PRODUCT_ID_SIZE, expected_subject);
+ if (0 != avb_safe_memcmp(certificate->signed_data.subject,
+ expected_subject,
+ AVB_SHA256_DIGEST_SIZE)) {
+ avb_error("PUK: Product ID mismatch.\n");
+ return false;
+ }
+ return true;
+}
+
+AvbIOResult avb_atx_validate_vbmeta_public_key(
+ AvbOps* ops,
+ const uint8_t* public_key_data,
+ size_t public_key_length,
+ const uint8_t* public_key_metadata,
+ size_t public_key_metadata_length,
+ bool* out_is_trusted) {
+ AvbIOResult result = AVB_IO_RESULT_OK;
+ AvbAtxPermanentAttributes permanent_attributes;
+ uint8_t permanent_attributes_hash[AVB_SHA256_DIGEST_SIZE];
+ AvbAtxPublicKeyMetadata metadata;
+ uint64_t minimum_version;
+
+ /* Be pessimistic so we can exit early without having to remember to clear.
+ */
+ *out_is_trusted = false;
+
+ /* Read and verify permanent attributes. */
+ result = ops->atx_ops->read_permanent_attributes(ops->atx_ops,
+ &permanent_attributes);
+ if (result != AVB_IO_RESULT_OK) {
+ avb_error("Failed to read permanent attributes.\n");
+ return result;
+ }
+ result = ops->atx_ops->read_permanent_attributes_hash(
+ ops->atx_ops, permanent_attributes_hash);
+ if (result != AVB_IO_RESULT_OK) {
+ avb_error("Failed to read permanent attributes hash.\n");
+ return result;
+ }
+ if (!verify_permanent_attributes(&permanent_attributes,
+ permanent_attributes_hash)) {
+ return AVB_IO_RESULT_OK;
+ }
+
+ /* Sanity check public key metadata. */
+ if (public_key_metadata_length != sizeof(AvbAtxPublicKeyMetadata)) {
+ avb_error("Invalid public key metadata.\n");
+ return AVB_IO_RESULT_OK;
+ }
+ avb_memcpy(&metadata, public_key_metadata, sizeof(AvbAtxPublicKeyMetadata));
+ if (metadata.version != 1) {
+ avb_error("Unsupported public key metadata.\n");
+ return AVB_IO_RESULT_OK;
+ }
+
+ /* Verify the PIK certificate. */
+ result = ops->read_rollback_index(
+ ops, AVB_ATX_PIK_VERSION_LOCATION, &minimum_version);
+ if (result != AVB_IO_RESULT_OK) {
+ avb_error("Failed to read PIK minimum version.\n");
+ return result;
+ }
+ if (!verify_pik_certificate(&metadata.product_intermediate_key_certificate,
+ permanent_attributes.product_root_public_key,
+ minimum_version)) {
+ return AVB_IO_RESULT_OK;
+ }
+
+ /* Verify the PSK certificate. */
+ result = ops->read_rollback_index(
+ ops, AVB_ATX_PSK_VERSION_LOCATION, &minimum_version);
+ if (result != AVB_IO_RESULT_OK) {
+ avb_error("Failed to read PSK minimum version.\n");
+ return result;
+ }
+ if (!verify_psk_certificate(
+ &metadata.product_signing_key_certificate,
+ metadata.product_intermediate_key_certificate.signed_data.public_key,
+ minimum_version,
+ permanent_attributes.product_id)) {
+ return AVB_IO_RESULT_OK;
+ }
+
+ /* Verify the PSK is the same key that verified vbmeta. */
+ if (public_key_length != AVB_ATX_PUBLIC_KEY_SIZE) {
+ avb_error("Public key length mismatch.\n");
+ return AVB_IO_RESULT_OK;
+ }
+ if (0 != avb_safe_memcmp(
+ metadata.product_signing_key_certificate.signed_data.public_key,
+ public_key_data,
+ AVB_ATX_PUBLIC_KEY_SIZE)) {
+ avb_error("Public key mismatch.\n");
+ return AVB_IO_RESULT_OK;
+ }
+
+ /* Report the key versions used during verification. */
+ ops->atx_ops->set_key_version(
+ ops->atx_ops,
+ AVB_ATX_PIK_VERSION_LOCATION,
+ metadata.product_intermediate_key_certificate.signed_data.key_version);
+ ops->atx_ops->set_key_version(
+ ops->atx_ops,
+ AVB_ATX_PSK_VERSION_LOCATION,
+ metadata.product_signing_key_certificate.signed_data.key_version);
+
+ *out_is_trusted = true;
+ return AVB_IO_RESULT_OK;
+}
+
+AvbIOResult avb_atx_generate_unlock_challenge(
+ AvbAtxOps* atx_ops, AvbAtxUnlockChallenge* out_unlock_challenge) {
+ AvbIOResult result = AVB_IO_RESULT_OK;
+ AvbAtxPermanentAttributes permanent_attributes;
+
+ /* We need the permanent attributes to compute the product_id_hash. */
+ result = atx_ops->read_permanent_attributes(atx_ops, &permanent_attributes);
+ if (result != AVB_IO_RESULT_OK) {
+ avb_error("Failed to read permanent attributes.\n");
+ return result;
+ }
+ result = atx_ops->get_random(
+ atx_ops, AVB_ATX_UNLOCK_CHALLENGE_SIZE, last_unlock_challenge);
+ if (result != AVB_IO_RESULT_OK) {
+ avb_error("Failed to generate random challenge.\n");
+ return result;
+ }
+ out_unlock_challenge->version = 1;
+ sha256(permanent_attributes.product_id,
+ AVB_ATX_PRODUCT_ID_SIZE,
+ out_unlock_challenge->product_id_hash);
+ avb_memcpy(out_unlock_challenge->challenge,
+ last_unlock_challenge,
+ AVB_ATX_UNLOCK_CHALLENGE_SIZE);
+ return result;
+}
+
+AvbIOResult avb_atx_validate_unlock_credential(
+ AvbAtxOps* atx_ops,
+ const AvbAtxUnlockCredential* unlock_credential,
+ bool* out_is_trusted) {
+ AvbIOResult result = AVB_IO_RESULT_OK;
+ AvbAtxPermanentAttributes permanent_attributes;
+ uint8_t permanent_attributes_hash[AVB_SHA256_DIGEST_SIZE];
+ uint64_t minimum_version;
+ const AvbAlgorithmData* algorithm_data;
+ uint8_t challenge_hash[AVB_SHA512_DIGEST_SIZE];
+
+ /* Be pessimistic so we can exit early without having to remember to clear.
+ */
+ *out_is_trusted = false;
+
+ /* Sanity check the credential. */
+ if (unlock_credential->version != 1) {
+ avb_error("Unsupported unlock credential format.\n");
+ return AVB_IO_RESULT_OK;
+ }
+
+ /* Read and verify permanent attributes. */
+ result = atx_ops->read_permanent_attributes(atx_ops, &permanent_attributes);
+ if (result != AVB_IO_RESULT_OK) {
+ avb_error("Failed to read permanent attributes.\n");
+ return result;
+ }
+ result = atx_ops->read_permanent_attributes_hash(atx_ops,
+ permanent_attributes_hash);
+ if (result != AVB_IO_RESULT_OK) {
+ avb_error("Failed to read permanent attributes hash.\n");
+ return result;
+ }
+ if (!verify_permanent_attributes(&permanent_attributes,
+ permanent_attributes_hash)) {
+ return AVB_IO_RESULT_OK;
+ }
+
+ /* Verify the PIK certificate. */
+ result = atx_ops->ops->read_rollback_index(
+ atx_ops->ops, AVB_ATX_PIK_VERSION_LOCATION, &minimum_version);
+ if (result != AVB_IO_RESULT_OK) {
+ avb_error("Failed to read PIK minimum version.\n");
+ return result;
+ }
+ if (!verify_pik_certificate(
+ &unlock_credential->product_intermediate_key_certificate,
+ permanent_attributes.product_root_public_key,
+ minimum_version)) {
+ return AVB_IO_RESULT_OK;
+ }
+
+ /* Verify the PUK certificate. The minimum version is shared with the PSK. */
+ result = atx_ops->ops->read_rollback_index(
+ atx_ops->ops, AVB_ATX_PSK_VERSION_LOCATION, &minimum_version);
+ if (result != AVB_IO_RESULT_OK) {
+ avb_error("Failed to read PSK minimum version.\n");
+ return result;
+ }
+ if (!verify_puk_certificate(
+ &unlock_credential->product_unlock_key_certificate,
+ unlock_credential->product_intermediate_key_certificate.signed_data
+ .public_key,
+ minimum_version,
+ permanent_attributes.product_id)) {
+ return AVB_IO_RESULT_OK;
+ }
+
+ /* Verify the challenge signature. */
+ algorithm_data = avb_get_algorithm_data(AVB_ALGORITHM_TYPE_SHA512_RSA4096);
+ sha512(last_unlock_challenge, AVB_ATX_UNLOCK_CHALLENGE_SIZE, challenge_hash);
+ if (!avb_rsa_verify(unlock_credential->product_unlock_key_certificate
+ .signed_data.public_key,
+ AVB_ATX_PUBLIC_KEY_SIZE,
+ unlock_credential->challenge_signature,
+ AVB_RSA4096_NUM_BYTES,
+ challenge_hash,
+ AVB_SHA512_DIGEST_SIZE,
+ algorithm_data->padding,
+ algorithm_data->padding_len)) {
+ avb_error("Invalid unlock challenge signature.\n");
+ return AVB_IO_RESULT_OK;
+ }
+
+ *out_is_trusted = true;
+ return AVB_IO_RESULT_OK;
+}
diff --git a/lib/avb/libavb_user/Kconfig b/lib/avb/libavb_user/Kconfig
index c9a8da265a..6a5a307d4a 100755
--- a/lib/avb/libavb_user/Kconfig
+++ b/lib/avb/libavb_user/Kconfig
@@ -7,15 +7,16 @@ config AVB_LIBAVB_USER
to fastboot and kernel.
config AVB_VBMETA_PUBLIC_KEY_VALIDATE
- bool "Support vbmeta public key validate"
- depends on AVB_LIBAVB_USER
- help
- support vbmeta public key validate, system bootflow would be
- uninterruptale when it is enabled:
- - only allow "boot_android" as bootcmd;
- - enter rockusb or fastboot when boot failed;
- - not allow ctrl+c to enter hush;
- only the CONFIG_BOOTDELAY can interrupt the bootflow.
+ bool "Support vbmeta public key validate"
+ depends on AVB_LIBAVB_USER
+ select CONSOLE_DISABLE_CTRLC
+ help
+ support vbmeta public key validate, system bootflow would be
+ uninterruptale when it is enabled:
+ - only allow "boot_android" as bootcmd;
+ - enter rockusb or fastboot when boot failed;
+ - not allow ctrl+c to enter hush;
+ only the CONFIG_BOOTDELAY can interrupt the bootflow.
config SPL_AVB_LIBAVB_USER
bool "Android AVB read/write hardware for spl"
diff --git a/lib/avb/libavb_user/avb_ops_user.c b/lib/avb/libavb_user/avb_ops_user.c
index ba20a41fc8..9d4db76340 100644
--- a/lib/avb/libavb_user/avb_ops_user.c
+++ b/lib/avb/libavb_user/avb_ops_user.c
@@ -354,6 +354,7 @@ AvbIOResult avb_read_perm_attr(AvbAtxOps *atx_ops,
AvbIOResult avb_read_perm_attr_hash(AvbAtxOps *atx_ops,
uint8_t hash[AVB_SHA256_DIGEST_SIZE])
{
+#ifndef CONFIG_ROCKCHIP_PRELOADER_PUB_KEY
#ifdef CONFIG_OPTEE_CLIENT
if (trusty_read_attribute_hash((uint32_t *)hash,
AVB_SHA256_DIGEST_SIZE / 4))
@@ -362,6 +363,7 @@ AvbIOResult avb_read_perm_attr_hash(AvbAtxOps *atx_ops,
avb_error("Please open the macro!\n");
return -1;
#endif
+#endif
return AVB_IO_RESULT_OK;
}
diff --git a/lib/avb/rk_avb_user/Kconfig b/lib/avb/rk_avb_user/Kconfig
index b183bfcc72..eb324616bd 100755
--- a/lib/avb/rk_avb_user/Kconfig
+++ b/lib/avb/rk_avb_user/Kconfig
@@ -20,3 +20,10 @@ config TPL_RK_AVB_LIBAVB_USER
This config support the android things system to
read/write hardware image, like vbmeta, misc, and
so on. And it can provide some a/b and avb information
+
+config ROCKCHIP_PRELOADER_PUB_KEY
+ bool "Rockchip AVB use pre-loader public key"
+ depends on AVB_LIBAVB_USER
+ select CRYPTO_ROCKCHIP
+ help
+ Use pre-loader public key to decode in avb.
diff --git a/lib/avb/rk_avb_user/rk_avb_ops_user.c b/lib/avb/rk_avb_user/rk_avb_ops_user.c
index b58a81fe95..f14ff8ad22 100644
--- a/lib/avb/rk_avb_user/rk_avb_ops_user.c
+++ b/lib/avb/rk_avb_user/rk_avb_ops_user.c
@@ -24,8 +24,45 @@
#include <android_avb/avb_atx_validate.h>
#include <android_avb/rk_avb_ops_user.h>
#include <boot_rkimg.h>
+#include <asm/arch/rk_atags.h>
/* rk used */
+int rk_avb_get_pub_key(struct rk_pub_key *pub_key)
+{
+ struct tag *t = NULL;
+
+ t = atags_get_tag(ATAG_PUB_KEY);
+ if (!t)
+ return -1;
+
+ memcpy(pub_key, t->u.pub_key.data, sizeof(struct rk_pub_key));
+
+ return 0;
+}
+int rk_avb_get_perm_attr_cer(uint8_t *cer, uint32_t size)
+{
+#ifdef CONFIG_OPTEE_CLIENT
+ if (trusty_read_permanent_attributes_cer((uint8_t *)cer, size))
+ return -EIO;
+
+ return 0;
+#else
+ return -1;
+#endif
+}
+
+int rk_avb_set_perm_attr_cer(uint8_t *cer, uint32_t size)
+{
+#ifdef CONFIG_OPTEE_CLIENT
+ if (trusty_write_permanent_attributes_cer((uint8_t *)cer, size))
+ return -EIO;
+
+ return 0;
+#else
+ return -1;
+#endif
+}
+
int rk_avb_read_slot_count(char *slot_count)
{
*slot_count = SLOT_NUM;
@@ -117,8 +154,14 @@ int rk_avb_get_current_slot(char *select_slot)
}
if (rk_avb_ab_slot_select(ops->ab_ops, select_slot) != 0) {
- printf("get_current_slot error!\n");
- ret = -1;
+ printf("###There is no bootable slot, bring up last_boot!###\n");
+ if (rk_get_lastboot() == 1)
+ memcpy(select_slot, "_b", 2);
+ else if(rk_get_lastboot() == 0)
+ memcpy(select_slot, "_a", 2);
+ else
+ return -1;
+ ret = 0;
}
avb_ops_user_free(ops);
@@ -697,3 +740,30 @@ int rk_generate_unlock_challenge(void *buffer, uint32_t *challenge_len)
else
return -1;
}
+
+int rk_get_lastboot(void)
+{
+
+ AvbIOResult io_ret = AVB_IO_RESULT_OK;
+ AvbABData ab_data;
+ int lastboot = -1;
+ AvbOps* ops;
+
+ ops = avb_ops_user_new();
+ if (ops == NULL) {
+ printf("avb_ops_user_new() failed!\n");
+ return -1;
+ }
+
+ io_ret = ops->ab_ops->read_ab_metadata(ops->ab_ops, &ab_data);
+ if (io_ret != AVB_IO_RESULT_OK) {
+ avb_error("I/O error while loading A/B metadata.\n");
+ goto out;
+ }
+
+ lastboot = ab_data.last_boot;
+out:
+ avb_ops_user_free(ops);
+
+ return lastboot;
+}
diff --git a/lib/bidram.c b/lib/bidram.c
new file mode 100644
index 0000000000..b6859150fd
--- /dev/null
+++ b/lib/bidram.c
@@ -0,0 +1,445 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
+ */
+
+#include <common.h>
+#include <lmb.h>
+#include <bidram.h>
+#include <malloc.h>
+#include <sysmem.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define MAX_BAD_MEMBLK 8
+
+#define BIDRAM_R(fmt, args...) printf(fmt, ##args)
+#define BIDRAM_I(fmt, args...) printf("Bidram: "fmt, ##args)
+#define BIDRAM_W(fmt, args...) printf("Bidram Warn: "fmt, ##args)
+#define BIDRAM_E(fmt, args...) printf("Bidram Error: "fmt, ##args)
+#define BIDRAM_D(fmt, args...) debug("Bidram Debug: "fmt, ##args)
+
+struct bidram plat_bidram __section(".data") = { .has_init = false, };
+
+static int bidram_has_init(void)
+{
+ if (!plat_bidram.has_init) {
+ BIDRAM_E("Framework is not initialized\n");
+ return 0;
+ }
+
+ return 1;
+}
+
+void bidram_dump(void)
+{
+ struct bidram *bidram = &plat_bidram;
+ struct lmb *lmb = &bidram->lmb;
+ struct memblock *mem;
+ struct list_head *node;
+ ulong memory_size = 0;
+ ulong reserved_size = 0;
+ ulong i;
+
+ if (!bidram_has_init())
+ return;
+
+ printf("\n\nbidram_dump_all:\n");
+
+ /* Memory pool */
+ printf(" --------------------------------------------------------------------\n");
+ for (i = 0; i < lmb->memory.cnt; i++) {
+ memory_size += lmb->memory.region[i].size;
+ printf(" memory.rgn[%ld].addr = 0x%08lx - 0x%08lx (size: 0x%08lx)\n", i,
+ (ulong)lmb->memory.region[i].base,
+ (ulong)lmb->memory.region[i].base +
+ (ulong)lmb->memory.region[i].size,
+ (ulong)lmb->memory.region[i].size);
+ }
+ printf("\n memory.total = 0x%08lx (%ld MiB. %ld KiB)\n",
+ (ulong)memory_size,
+ SIZE_MB((ulong)memory_size),
+ SIZE_KB((ulong)memory_size));
+
+ /* Reserved */
+ i = 0;
+ printf(" --------------------------------------------------------------------\n");
+ list_for_each(node, &bidram->reserved_head) {
+ mem = list_entry(node, struct memblock, node);
+ reserved_size += mem->size;
+ printf(" reserved.rgn[%ld].name = \"%s\"\n", i, mem->attr.name);
+ printf(" .addr = 0x%08lx - 0x%08lx (size: 0x%08lx)\n",
+ (ulong)mem->base, (ulong)mem->base + (ulong)mem->size,
+ (ulong)mem->size);
+ i++;
+ }
+ printf("\n reserved.total = 0x%08lx (%ld MiB. %ld KiB)\n",
+ (ulong)reserved_size,
+ SIZE_MB((ulong)reserved_size),
+ SIZE_KB((ulong)reserved_size));
+
+ /* LMB core reserved */
+ printf(" --------------------------------------------------------------------\n");
+ reserved_size = 0;
+ for (i = 0; i < lmb->reserved.cnt; i++) {
+ reserved_size += lmb->reserved.region[i].size;
+ printf(" LMB.reserved[%ld].addr = 0x%08lx - 0x%08lx (size: 0x%08lx)\n", i,
+ (ulong)lmb->reserved.region[i].base,
+ (ulong)lmb->reserved.region[i].base +
+ (ulong)lmb->reserved.region[i].size,
+ (ulong)lmb->reserved.region[i].size);
+ }
+
+ printf("\n reserved.core.total = 0x%08lx (%ld MiB. %ld KiB)\n",
+ (ulong)reserved_size,
+ SIZE_MB((ulong)reserved_size),
+ SIZE_KB((ulong)reserved_size));
+ printf(" --------------------------------------------------------------------\n\n");
+}
+
+static int bidram_add(phys_addr_t base, phys_size_t size)
+{
+ struct bidram *bidram = &plat_bidram;
+ int ret;
+
+ if (!bidram_has_init())
+ return -ENOSYS;
+
+ if (!size)
+ return -EINVAL;
+
+ ret = lmb_add(&bidram->lmb, base, size);
+ if (ret < 0)
+ BIDRAM_E("Failed to add bidram at 0x%08lx - 0x%08lx\n",
+ (ulong)base, (ulong)(base + size));
+
+ return (ret >= 0) ? 0 : ret;
+}
+
+void bidram_gen_gd_bi_dram(void)
+{
+ struct lmb *lmb = &plat_bidram.lmb;
+ struct lmb_property *mem_rgn = lmb->memory.region;
+ struct lmb_property *res_rgn = lmb->reserved.region;
+ int rsv_cnt = lmb->reserved.cnt;
+ int i, idx = 0;
+
+ if (!gd || !gd->bd) {
+ BIDRAM_D("Ignore bi dram bank update\n");
+ return;
+ }
+
+ /*
+ * LBM default init:
+ * lmb->reserved.cnt = 1;
+ * lmb->reserved.region[0].base = 0;
+ * lmb->reserved.region[0].size = 0;
+ *
+ * Here handle that: there is the only one dram bank available.
+ */
+ if (rsv_cnt == 1 && !res_rgn[0].base && !res_rgn[0].size) {
+ gd->bd->bi_dram[0].start = mem_rgn[0].base;
+ gd->bd->bi_dram[0].size = mem_rgn[0].size;
+ goto done;
+ }
+
+ /* If reserved rgn is not from sdram start */
+ if (res_rgn[0].base != mem_rgn[0].base) {
+ gd->bd->bi_dram[idx].start = mem_rgn[0].base;
+ gd->bd->bi_dram[idx].size = res_rgn[0].base -
+ gd->bd->bi_dram[idx].start;
+ idx++;
+ }
+
+ /*
+ * Note: If reserved rgn is not from sdram start, idx=1 now, otherwise 0.
+ */
+ for (i = 0; i < rsv_cnt; i++, idx++) {
+ if (res_rgn[i].base + res_rgn[i].size >= gd->ram_top)
+ goto done;
+
+ gd->bd->bi_dram[idx].start = res_rgn[i].base + res_rgn[i].size;
+ if (i + 1 < rsv_cnt)
+ gd->bd->bi_dram[idx].size = res_rgn[i + 1].base -
+ gd->bd->bi_dram[idx].start;
+ else
+ gd->bd->bi_dram[idx].size = gd->ram_top -
+ gd->bd->bi_dram[idx].start;
+ }
+done:
+ for (i = 0; i < idx; i++) {
+ BIDRAM_D("gd bi_dram[%d]: start=0x%08lx, end=0x%08lx\n",
+ i, (ulong)gd->bd->bi_dram[i].start,
+ (ulong)gd->bd->bi_dram[i].start +
+ (ulong)gd->bd->bi_dram[i].size);
+ }
+}
+
+static int bidram_is_overlap(phys_addr_t base1, phys_size_t size1,
+ phys_addr_t base2, phys_size_t size2)
+{
+ return ((base1 < (base2 + size2)) && (base2 < (base1 + size1)));
+}
+
+static int bidram_core_reserve(enum memblk_id id, const char *mem_name,
+ phys_addr_t base, phys_size_t size)
+{
+ struct bidram *bidram = &plat_bidram;
+ struct memblk_attr attr;
+ struct memblock *mem;
+ struct list_head *node;
+ const char *name;
+ int ret;
+
+ if (!bidram_has_init())
+ return -ENOSYS;
+
+ if (id == MEMBLK_ID_BY_NAME) {
+ if (!mem_name) {
+ BIDRAM_E("NULL name for reserve bidram\n");
+ return -EINVAL;
+ } else {
+ name = mem_name;
+ }
+ } else {
+ if (id > MEMBLK_ID_UNK && id < MEMBLK_ID_MAX) {
+ attr = mem_attr[id];
+ name = attr.name;
+ } else {
+ BIDRAM_E("Unsupport memblk id %d for reserve bidram\n", id);
+ return -EINVAL;
+ }
+ }
+
+ if (!name) {
+ BIDRAM_E("NULL name for reserved bidram\n");
+ return -EINVAL;
+ }
+
+ if (!size)
+ return 0;
+
+ /* Check overlap */
+ list_for_each(node, &bidram->reserved_head) {
+ mem = list_entry(node, struct memblock, node);
+ BIDRAM_D("Has reserved: %s 0x%08lx - 0x%08lx\n",
+ mem->attr.name, (ulong)mem->base,
+ (ulong)(mem->base + mem->size));
+ if (!strcmp(mem->attr.name, name)) {
+ BIDRAM_E("Failed to double reserve for existence \"%s\"\n", name);
+ return -EEXIST;
+ } else if (bidram_is_overlap(mem->base, mem->size, base, size)) {
+ BIDRAM_D("\"%s\" (0x%08lx - 0x%08lx) reserve is "
+ "overlap with existence \"%s\" (0x%08lx - "
+ "0x%08lx)\n",
+ name, (ulong)base, (ulong)(base + size), mem->attr.name,
+ (ulong)mem->base, (ulong)(mem->base + mem->size));
+ }
+ }
+
+ BIDRAM_D("Reserve: \"%s\" 0x%08lx - 0x%08lx\n",
+ name, (ulong)base, (ulong)(base + size));
+
+ ret = lmb_reserve(&bidram->lmb, base, size);
+ if (ret >= 0) {
+ mem = malloc(sizeof(*mem));
+ if (!mem) {
+ BIDRAM_E("No memory for \"%s\" reserve bidram\n", name);
+ return -ENOMEM;
+ }
+
+#ifdef CONFIG_SYSMEM
+ /* Sync to sysmem */
+ if (sysmem_has_init()) {
+ void *paddr;
+
+ if (id == MEMBLK_ID_BY_NAME)
+ paddr = sysmem_alloc_base_by_name(name, base, size);
+ else
+ paddr = sysmem_alloc_base(id, base, size);
+ if (!paddr) {
+ BIDRAM_E("Sync \"%s\" to sysmem failed\n", name);
+ return -ENOMEM;
+ }
+ }
+#endif
+ mem->base = base;
+ mem->size = size;
+ if (id == MEMBLK_ID_BY_NAME) {
+ mem->attr.name = name;
+ mem->attr.flags = 0;
+ } else {
+ mem->attr = attr;
+ }
+ list_add_tail(&mem->node, &bidram->reserved_head);
+ } else {
+ BIDRAM_E("Failed to reserve \"%s\" 0x%08lx - 0x%08lx\n",
+ name, (ulong)base, (ulong)(base + size));
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+int bidram_reserve(enum memblk_id id, phys_addr_t base, phys_size_t size)
+{
+ int ret;
+
+ ret = bidram_core_reserve(id, NULL, base, size);
+ if (!ret)
+ bidram_gen_gd_bi_dram();
+ else
+ bidram_dump();
+
+ return ret;
+}
+
+int bidram_reserve_by_name(const char *name,
+ phys_addr_t base, phys_size_t size)
+{
+ int ret;
+
+ ret = bidram_core_reserve(MEMBLK_ID_BY_NAME, name, base, size);
+ if (!ret)
+ bidram_gen_gd_bi_dram();
+ else
+ bidram_dump();
+
+ return ret;
+}
+
+int bidram_initr(void)
+{
+ return !bidram_get_ram_size();
+}
+
+phys_size_t bidram_get_ram_size(void)
+{
+ struct bidram *bidram = &plat_bidram;
+ struct memblock bad[MAX_BAD_MEMBLK];
+ struct memblock *list;
+ phys_size_t ram_addr_end = CONFIG_SYS_SDRAM_BASE;
+ phys_addr_t end_addr;
+ parse_fn_t parse_fn;
+ int i, count, ret;
+ int bad_cnt = 0;
+ char bad_name[12];
+
+ parse_fn = board_bidram_parse_fn();
+ if (!parse_fn) {
+ BIDRAM_E("Can't find dram parse fn\n");
+ return 0;
+ }
+
+ list = parse_fn(&count);
+ if (!list) {
+ BIDRAM_E("Can't get dram banks\n");
+ return 0;
+ }
+
+ if (count > CONFIG_NR_DRAM_BANKS) {
+ BIDRAM_E("Too many dram banks, %d is over max: %d\n",
+ count, CONFIG_NR_DRAM_BANKS);
+ return 0;
+ }
+
+ /* Initial plat_bidram */
+ lmb_init(&bidram->lmb);
+ INIT_LIST_HEAD(&bidram->reserved_head);
+ bidram->has_init = true;
+
+ /* Initial memory pool */
+ for (i = 0; i < count; i++) {
+ BIDRAM_D("Add bank[%d] start=0x%08lx, end=0x%08lx\n",
+ i, (ulong)list[i].base,
+ (ulong)list[i].base + (ulong)list[i].size);
+
+ if (!list[i].size)
+ continue;
+
+ /* We assume the last block gives the ram addr end */
+ if (i == count - 1) {
+ ram_addr_end = list[i].base + list[i].size;
+ ret = bidram_add(CONFIG_SYS_SDRAM_BASE,
+ ram_addr_end - CONFIG_SYS_SDRAM_BASE);
+ if (ret) {
+ BIDRAM_E("Failed to add bidram from bi_dram[%d]\n", i);
+ return 0;
+ }
+ }
+
+ /* This is a bad dram bank? record it */
+ if (i > 0) {
+ end_addr = list[i - 1].base + list[i - 1].size;
+
+ if (list[i].base != end_addr) {
+ snprintf(bad_name, 12, "%s%d", "BAD_RAM.", i - 1);
+ bad[bad_cnt].attr.name = strdup(bad_name);
+ bad[bad_cnt].base = end_addr;
+ bad[bad_cnt].size = list[i].base - end_addr;
+ bad_cnt++;
+ if (bad_cnt > MAX_BAD_MEMBLK) {
+ BIDRAM_E("Too many bad memory blocks\n");
+ return 0;
+ }
+ }
+ }
+ }
+
+ /* Reserve bad dram bank after bidram_add(), treat as reserved region */
+ for (i = 0; i < bad_cnt; i++) {
+ if (gd->flags & GD_FLG_RELOC)
+ BIDRAM_R("Bad memblk%d: 0x%08lx - 0x%08lx\n",
+ i, (ulong)bad[i].base,
+ (ulong)bad[i].base + (ulong)bad[i].size);
+
+ ret = bidram_reserve_by_name(bad[i].attr.name,
+ bad[i].base, bad[i].size);
+ if (ret) {
+ BIDRAM_E("Failed to add bad memblk[%d]\n", i);
+ return 0;
+ }
+ }
+
+ /* Reserved for board */
+ ret = board_bidram_reserve(bidram);
+ if (ret) {
+ BIDRAM_E("Failed to reserve bidram for board\n");
+ return 0;
+ }
+
+ BIDRAM_D("DRAM size: 0x%08lx\n",
+ (ulong)ram_addr_end - CONFIG_SYS_SDRAM_BASE);
+
+#ifdef DEBUG
+ bidram_dump();
+#endif
+
+ return (ram_addr_end - CONFIG_SYS_SDRAM_BASE);
+}
+
+__weak parse_fn_t board_bidram_parse_fn(void)
+{
+ /* please define platform specific board_bidram_parse_fn() */
+ return NULL;
+}
+
+__weak int board_bidram_reserve(struct bidram *bidram)
+{
+ /* please define platform specific board_bidram_reserve() */
+ return 0;
+}
+
+static int do_dump_bidram(cmd_tbl_t *cmdtp, int flag,
+ int argc, char *const argv[])
+{
+ bidram_dump();
+ return 0;
+}
+
+U_BOOT_CMD(
+ dump_bidram, 1, 1, do_dump_bidram,
+ "Dump bidram layout",
+ ""
+);
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index d06dbdf10b..863d6142e7 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -92,16 +92,6 @@ fdt_addr_t fdtdec_get_addr_size_fixed(const void *blob, int node,
debug("%s: %s: ", __func__, prop_name);
- if (na > (sizeof(fdt_addr_t) / sizeof(fdt32_t))) {
- debug("(na too large for fdt_addr_t type)\n");
- return FDT_ADDR_T_NONE;
- }
-
- if (ns > (sizeof(fdt_size_t) / sizeof(fdt32_t))) {
- debug("(ns too large for fdt_size_t type)\n");
- return FDT_ADDR_T_NONE;
- }
-
prop = fdt_getprop(blob, node, prop_name, &len);
if (!prop) {
debug("(not found)\n");
diff --git a/lib/optee_clientApi/OpteeClientApiLib.c b/lib/optee_clientApi/OpteeClientApiLib.c
index a2f8c12ab4..01f24ddb3e 100644
--- a/lib/optee_clientApi/OpteeClientApiLib.c
+++ b/lib/optee_clientApi/OpteeClientApiLib.c
@@ -17,11 +17,18 @@ TEEC_Result OpteeClientApiLibInitialize(void)
{
TEEC_Result status = TEEC_SUCCESS;
- OpteeClientMemInit();
-
- OpteeClientRkFsInit();
+ status = OpteeClientMemInit();
+ if (status != TEEC_SUCCESS) {
+ printf("OpteeClientMemInit fail!");
+ return status;
+ }
+ status = OpteeClientRkFsInit();
+ if (status != TEEC_SUCCESS) {
+ printf("OpteeClientRkFsInit fail!");
+ return status;
+ }
- return status;
+ return TEEC_SUCCESS;
}
/*
diff --git a/lib/optee_clientApi/OpteeClientInterface.c b/lib/optee_clientApi/OpteeClientInterface.c
index d2d5c758f4..c2f931ecc3 100644
--- a/lib/optee_clientApi/OpteeClientInterface.c
+++ b/lib/optee_clientApi/OpteeClientInterface.c
@@ -15,7 +15,7 @@
#define BOOT_FROM_EMMC (1 << 1)
-void test_optee(void)
+uint32_t test_optee(void)
{
TEEC_Result TeecResult;
TEEC_Context TeecContext;
@@ -29,13 +29,16 @@ void test_optee(void)
dev_desc = rockchip_get_bootdev();
if (!dev_desc) {
printf("%s: dev_desc is NULL!\n", __func__);
- return;
+ return -TEEC_ERROR_GENERIC;
}
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -54,6 +57,8 @@ void test_optee(void)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -61,6 +66,8 @@ void test_optee(void)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, "filename_test", SharedMem0.size);
@@ -70,6 +77,8 @@ void test_optee(void)
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memset(SharedMem1.buffer, 'a', SharedMem1.size);
@@ -89,16 +98,14 @@ void test_optee(void)
1,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
-
TEEC_CloseSession(&TeecSession);
-
TEEC_FinalizeContext(&TeecContext);
-
- debug("testmm end\n");
- debug("TeecResult %x\n", TeecResult);
+ return TeecResult;
}
static uint8_t b2hs_add_base(uint8_t in)
@@ -146,10 +153,14 @@ uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
}
b2hs((uint8_t *)&slot, hs, 4, 9);
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -167,8 +178,9 @@ uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
TEEC_LOGIN_PUBLIC,
NULL,
&TeecOperation,
-
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -176,6 +188,8 @@ uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, hs, SharedMem0.size);
@@ -185,6 +199,8 @@ uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
@@ -203,15 +219,12 @@ uint32_t trusty_read_rollback_index(uint32_t slot, uint64_t *value)
&ErrorOrigin);
if (TeecResult == TEEC_SUCCESS)
memcpy((char *)value, SharedMem1.buffer, SharedMem1.size);
-
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
-
TEEC_CloseSession(&TeecSession);
-
TEEC_FinalizeContext(&TeecContext);
- debug("testmm end\n");
return TeecResult;
}
@@ -234,9 +247,13 @@ uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
}
b2hs((uint8_t *)&slot, hs, 4, 9);
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -255,6 +272,8 @@ uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -262,6 +281,8 @@ uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, hs, SharedMem0.size);
@@ -271,6 +292,8 @@ uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem1.buffer, (char *)&value, SharedMem1.size);
@@ -290,16 +313,14 @@ uint32_t trusty_write_rollback_index(uint32_t slot, uint64_t value)
1,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
-
TEEC_CloseSession(&TeecSession);
-
TEEC_FinalizeContext(&TeecContext);
- debug("testmm end\n");
-
return TeecResult;
}
@@ -320,10 +341,13 @@ uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
return -TEEC_ERROR_GENERIC;
}
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -342,6 +366,8 @@ uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -349,6 +375,8 @@ uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
@@ -358,6 +386,8 @@ uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
@@ -377,11 +407,11 @@ uint32_t trusty_read_permanent_attributes(uint8_t *attributes, uint32_t size)
&ErrorOrigin);
if (TeecResult == TEEC_SUCCESS)
memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
- debug("testmm end\n");
return TeecResult;
}
@@ -403,10 +433,13 @@ uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
return -TEEC_ERROR_GENERIC;
}
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -425,6 +458,8 @@ uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -432,6 +467,8 @@ uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, "attributes", SharedMem0.size);
@@ -441,6 +478,8 @@ uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
@@ -460,12 +499,13 @@ uint32_t trusty_write_permanent_attributes(uint8_t *attributes, uint32_t size)
1,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
- debug("testmm end\n");
return TeecResult;
}
@@ -489,9 +529,14 @@ uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
return -TEEC_ERROR_GENERIC;
}
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
+
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
+
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
TEEC_NONE,
@@ -510,18 +555,24 @@ uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
SharedMem0.size = sizeof("rsacer");
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size);
TEEC_SharedMemory SharedMem1 = {0};
SharedMem1.size = size;
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
@@ -537,11 +588,11 @@ uint32_t trusty_read_permanent_attributes_cer(uint8_t *attributes,
&ErrorOrigin);
if (TeecResult == TEEC_SUCCESS)
memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
- debug("testmm end\n");
return TeecResult;
}
@@ -565,9 +616,14 @@ uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
return -TEEC_ERROR_GENERIC;
}
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
+
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
+
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
TEEC_NONE,
@@ -586,18 +642,24 @@ uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
SharedMem0.size = sizeof("rsacer");
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, "rsacer", SharedMem0.size);
TEEC_SharedMemory SharedMem1 = {0};
SharedMem1.size = size;
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem1.buffer, attributes, SharedMem1.size);
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
@@ -612,12 +674,13 @@ uint32_t trusty_write_permanent_attributes_cer(uint8_t *attributes,
1,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
- debug("testmm end\n");
return TeecResult;
}
@@ -639,10 +702,13 @@ uint32_t trusty_read_lock_state(uint8_t *lock_state)
return -TEEC_ERROR_GENERIC;
}
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -661,6 +727,8 @@ uint32_t trusty_read_lock_state(uint8_t *lock_state)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -668,6 +736,8 @@ uint32_t trusty_read_lock_state(uint8_t *lock_state)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
@@ -677,6 +747,8 @@ uint32_t trusty_read_lock_state(uint8_t *lock_state)
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
@@ -696,11 +768,11 @@ uint32_t trusty_read_lock_state(uint8_t *lock_state)
&ErrorOrigin);
if (TeecResult == TEEC_SUCCESS)
memcpy(lock_state, SharedMem1.buffer, SharedMem1.size);
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
- debug("testmm end\n");
return TeecResult;
}
@@ -722,10 +794,13 @@ uint32_t trusty_write_lock_state(uint8_t lock_state)
return -TEEC_ERROR_GENERIC;
}
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -744,6 +819,8 @@ uint32_t trusty_write_lock_state(uint8_t lock_state)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -751,6 +828,8 @@ uint32_t trusty_write_lock_state(uint8_t lock_state)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, "lock_state", SharedMem0.size);
@@ -760,6 +839,8 @@ uint32_t trusty_write_lock_state(uint8_t lock_state)
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem1.buffer, &lock_state, SharedMem1.size);
@@ -779,12 +860,13 @@ uint32_t trusty_write_lock_state(uint8_t lock_state)
1,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
- debug("testmm end\n");
return TeecResult;
}
@@ -806,10 +888,13 @@ uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
return -TEEC_ERROR_GENERIC;
}
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -828,6 +913,8 @@ uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -835,6 +922,8 @@ uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
@@ -844,6 +933,8 @@ uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
@@ -863,11 +954,11 @@ uint32_t trusty_read_flash_lock_state(uint8_t *flash_lock_state)
&ErrorOrigin);
if (TeecResult == TEEC_SUCCESS)
memcpy(flash_lock_state, SharedMem1.buffer, SharedMem1.size);
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
- debug("testmm end\n");
return TeecResult;
}
@@ -890,10 +981,13 @@ uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
return -TEEC_ERROR_GENERIC;
}
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -912,6 +1006,8 @@ uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -919,6 +1015,8 @@ uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, "flash_lock_state", SharedMem0.size);
@@ -928,6 +1026,8 @@ uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem1.buffer, &flash_lock_state, SharedMem1.size);
@@ -947,7 +1047,9 @@ uint32_t trusty_write_flash_lock_state(uint8_t flash_lock_state)
1,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
TEEC_CloseSession(&TeecSession);
@@ -969,9 +1071,13 @@ uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
TEEC_UUID *TeecUuid = &tempuuid;
TEEC_Operation TeecOperation = {0};
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_OpenSession(&TeecContext,
&TeecSession,
@@ -980,6 +1086,8 @@ uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
NULL,
NULL,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -987,6 +1095,8 @@ uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
@@ -1003,7 +1113,7 @@ uint32_t trusty_read_attribute_hash(uint32_t *buf, uint32_t length)
if (TeecResult == TEEC_SUCCESS)
memcpy(buf, SharedMem0.buffer, SharedMem0.size);
-
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
@@ -1023,9 +1133,13 @@ uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
TEEC_UUID *TeecUuid = &tempuuid;
TEEC_Operation TeecOperation = {0};
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_OpenSession(&TeecContext,
&TeecSession,
@@ -1034,6 +1148,8 @@ uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
NULL,
NULL,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -1041,6 +1157,8 @@ uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, buf, SharedMem0.size);
@@ -1056,7 +1174,9 @@ uint32_t trusty_write_attribute_hash(uint32_t *buf, uint32_t length)
1,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
@@ -1075,9 +1195,13 @@ uint32_t notify_optee_rpmb_ta(void)
TEEC_UUID *TeecUuid = &tempuuid;
TEEC_Operation TeecOperation = {0};
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_OpenSession(&TeecContext,
&TeecSession,
@@ -1086,6 +1210,8 @@ uint32_t notify_optee_rpmb_ta(void)
NULL,
NULL,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
TEEC_NONE,
@@ -1096,7 +1222,9 @@ uint32_t notify_optee_rpmb_ta(void)
2,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
@@ -1115,9 +1243,13 @@ uint32_t notify_optee_efuse_ta(void)
TEEC_UUID *TeecUuid = &tempuuid;
TEEC_Operation TeecOperation = {0};
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_OpenSession(&TeecContext,
&TeecSession,
@@ -1126,6 +1258,8 @@ uint32_t notify_optee_efuse_ta(void)
NULL,
NULL,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
TEEC_NONE,
@@ -1136,7 +1270,9 @@ uint32_t notify_optee_efuse_ta(void)
2,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
@@ -1163,9 +1299,13 @@ uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
TEEC_UUID *TeecUuid = &tempuuid;
TEEC_Operation TeecOperation = {0};
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_OpenSession(&TeecContext,
&TeecSession,
@@ -1174,6 +1314,8 @@ uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
NULL,
NULL,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -1181,6 +1323,8 @@ uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
@@ -1197,7 +1341,7 @@ uint32_t trusty_read_vbootkey_hash(uint32_t *buf, uint32_t length)
if (TeecResult == TEEC_SUCCESS)
memcpy(buf, SharedMem0.buffer, SharedMem0.size);
-
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
@@ -1216,9 +1360,13 @@ uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
TEEC_UUID *TeecUuid = &tempuuid;
TEEC_Operation TeecOperation = {0};
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_OpenSession(&TeecContext,
&TeecSession,
@@ -1227,6 +1375,8 @@ uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
NULL,
NULL,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -1234,6 +1384,8 @@ uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, buf, SharedMem0.size);
@@ -1249,7 +1401,9 @@ uint32_t trusty_write_vbootkey_hash(uint32_t *buf, uint32_t length)
4,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
@@ -1270,9 +1424,13 @@ uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
TEEC_UUID *TeecUuid = &tempuuid;
TEEC_Operation TeecOperation = {0};
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_OpenSession(&TeecContext,
&TeecSession,
@@ -1281,6 +1439,8 @@ uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
NULL,
NULL,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -1288,6 +1448,8 @@ uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
@@ -1307,7 +1469,7 @@ uint32_t trusty_read_vbootkey_enable_flag(uint8_t *flag)
if (bootflag == 0x000000FF)
*flag = 1;
}
-
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
@@ -1332,10 +1494,13 @@ uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
return -TEEC_ERROR_GENERIC;
}
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -1354,6 +1519,8 @@ uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -1361,6 +1528,8 @@ uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
@@ -1370,6 +1539,8 @@ uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
@@ -1388,11 +1559,11 @@ uint32_t trusty_read_permanent_attributes_flag(uint8_t *attributes)
&ErrorOrigin);
if (TeecResult == TEEC_SUCCESS)
memcpy(attributes, SharedMem1.buffer, SharedMem1.size);
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
- debug("testmm end\n");
return TeecResult;
}
@@ -1414,10 +1585,13 @@ uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
return -TEEC_ERROR_GENERIC;
}
- debug("testmm start\n");
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -1436,6 +1610,8 @@ uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -1443,6 +1619,8 @@ uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, "attributes_flag", SharedMem0.size);
@@ -1452,6 +1630,8 @@ uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem1.buffer, (char *)&attributes, SharedMem1.size);
@@ -1470,12 +1650,13 @@ uint32_t trusty_write_permanent_attributes_flag(uint8_t attributes)
1,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
TEEC_CloseSession(&TeecSession);
TEEC_FinalizeContext(&TeecContext);
- debug("testmm end\n");
return TeecResult;
}
@@ -1500,9 +1681,13 @@ uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
return -TEEC_ERROR_GENERIC;
}
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -1521,6 +1706,8 @@ uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -1528,6 +1715,8 @@ uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
@@ -1541,14 +1730,15 @@ uint32_t trusty_attest_dh(uint8_t *dh, uint32_t *dh_size)
143,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
*dh_size = TeecOperation.params[0].tmpref.size;
memcpy(dh, SharedMem0.buffer, SharedMem0.size);
-
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
-
TEEC_CloseSession(&TeecSession);
- TeecResult = TEEC_FinalizeContext(&TeecContext);
+ TEEC_FinalizeContext(&TeecContext);
return TeecResult;
}
@@ -1573,9 +1763,13 @@ uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
return -TEEC_ERROR_GENERIC;
}
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -1594,6 +1788,8 @@ uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -1601,6 +1797,8 @@ uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[0].tmpref.buffer = SharedMem0.buffer;
TeecOperation.params[0].tmpref.size = SharedMem0.size;
@@ -1614,14 +1812,15 @@ uint32_t trusty_attest_uuid(uint8_t *uuid, uint32_t *uuid_size)
144,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
*uuid_size = TeecOperation.params[0].tmpref.size;
memcpy(uuid, SharedMem0.buffer, SharedMem0.size);
-
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
-
TEEC_CloseSession(&TeecSession);
- TeecResult = TEEC_FinalizeContext(&TeecContext);
+ TEEC_FinalizeContext(&TeecContext);
return TeecResult;
}
@@ -1636,8 +1835,6 @@ uint32_t trusty_attest_get_ca(uint8_t *operation_start,
TEEC_Session TeecSession;
uint32_t ErrorOrigin;
- OpteeClientApiLibInitialize();
-
TEEC_UUID tempuuid = { 0x258be795, 0xf9ca, 0x40e6,
{ 0xa8, 0x69, 0x9c, 0xe6,
0x88, 0x6c, 0x5d, 0x5d
@@ -1653,9 +1850,13 @@ uint32_t trusty_attest_get_ca(uint8_t *operation_start,
return -TEEC_ERROR_GENERIC;
}
- OpteeClientApiLibInitialize();
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -1674,6 +1875,8 @@ uint32_t trusty_attest_get_ca(uint8_t *operation_start,
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -1681,6 +1884,8 @@ uint32_t trusty_attest_get_ca(uint8_t *operation_start,
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, operation_start, SharedMem0.size);
@@ -1693,6 +1898,8 @@ uint32_t trusty_attest_get_ca(uint8_t *operation_start,
SharedMem1.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem1);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
TeecOperation.params[1].tmpref.buffer = SharedMem1.buffer;
TeecOperation.params[1].tmpref.size = SharedMem1.size;
@@ -1706,11 +1913,16 @@ uint32_t trusty_attest_get_ca(uint8_t *operation_start,
145,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
*out_len = TeecOperation.params[1].tmpref.size;
memcpy(out, SharedMem1.buffer, SharedMem1.size);
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
TEEC_ReleaseSharedMemory(&SharedMem1);
+ TEEC_CloseSession(&TeecSession);
+ TEEC_FinalizeContext(&TeecContext);
return TeecResult;
}
@@ -1734,8 +1946,13 @@ uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
printf("%s: dev_desc is NULL!\n", __func__);
return -TEEC_ERROR_GENERIC;
}
+ TeecResult = OpteeClientApiLibInitialize();
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecResult = TEEC_InitializeContext(NULL, &TeecContext);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TeecOperation.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
TEEC_NONE,
@@ -1754,6 +1971,8 @@ uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
NULL,
&TeecOperation,
&ErrorOrigin);
+ if (TeecResult != TEEC_SUCCESS)
+ return TeecResult;
TEEC_SharedMemory SharedMem0 = {0};
@@ -1761,6 +1980,8 @@ uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
SharedMem0.flags = 0;
TeecResult = TEEC_AllocateSharedMemory(&TeecContext, &SharedMem0);
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
memcpy(SharedMem0.buffer, ca_response, SharedMem0.size);
@@ -1776,11 +1997,12 @@ uint32_t trusty_attest_set_ca(uint8_t *ca_response, uint32_t *ca_response_size)
146,
&TeecOperation,
&ErrorOrigin);
-
+ if (TeecResult != TEEC_SUCCESS)
+ goto exit;
+exit:
TEEC_ReleaseSharedMemory(&SharedMem0);
-
TEEC_CloseSession(&TeecSession);
- TeecResult = TEEC_FinalizeContext(&TeecContext);
+ TEEC_FinalizeContext(&TeecContext);
return TeecResult;
}
diff --git a/lib/optee_clientApi/OpteeClientMem.c b/lib/optee_clientApi/OpteeClientMem.c
index cec5b50c3b..d290567d83 100644
--- a/lib/optee_clientApi/OpteeClientMem.c
+++ b/lib/optee_clientApi/OpteeClientMem.c
@@ -14,7 +14,7 @@
void *my_mem_start;
uint32_t my_count;
-uint8_t *my_flag;
+uint8_t *my_flag = NULL;
typedef struct {
void *addrBlock;
uint32_t sizeBlock;
@@ -22,14 +22,25 @@ typedef struct {
} ALLOC_FLAG;
ALLOC_FLAG alloc_flags[50];
-void my_malloc_init(void *start, uint32_t size)
+int my_malloc_init(void *start, uint32_t size)
{
+ if (start == NULL || size == 0) {
+ printf("malloc init fail!");
+ return -1;
+ }
memset(start, 0, size);
my_mem_start = start;
my_count = size/4096;
- my_flag = malloc(size/4096);
+ if (my_flag == NULL) {
+ my_flag = malloc(size/4096);
+ if (my_flag == NULL) {
+ printf("malloc fail!");
+ return -1;
+ }
+ }
memset(my_flag, 0, size/4096);
memset(alloc_flags, 0, 50 * sizeof(ALLOC_FLAG));
+ return 0;
}
void write_usedblock(void *addr, uint32_t size)
@@ -75,7 +86,8 @@ void *my_malloc(uint32_t size)
uint32_t i, j, k, num;
num = (size - 1) / 4096 + 1;
-
+ if (my_count < num)
+ return 0;
for (i = 0; i < my_count - num; i++) {
if (*(my_flag + i) == 0) {
for (j = 0; j < num; j++) {
@@ -127,7 +139,7 @@ void my_free(void *ptr)
* Initlialize the memory component, for example providing the
* containing drivers handle.
*/
-void OpteeClientMemInit(void)
+int OpteeClientMemInit(void)
{
ARM_SMC_ARGS ArmSmcArgs = {0};
@@ -143,7 +155,7 @@ void OpteeClientMemInit(void)
debug("get share memory, arg0=0x%x arg1=0x%x arg2=0x%x arg3=0x%x\n",
ArmSmcArgs.Arg0, ArmSmcArgs.Arg1, ArmSmcArgs.Arg2, ArmSmcArgs.Arg3);
- my_malloc_init((void *)(size_t)ArmSmcArgs.Arg1, ArmSmcArgs.Arg2);
+ return my_malloc_init((void *)(size_t)ArmSmcArgs.Arg1, ArmSmcArgs.Arg2);
}
/*
diff --git a/lib/optee_clientApi/OpteeClientRPC.c b/lib/optee_clientApi/OpteeClientRPC.c
index 919e89fac1..c2ddbc381d 100644
--- a/lib/optee_clientApi/OpteeClientRPC.c
+++ b/lib/optee_clientApi/OpteeClientRPC.c
@@ -504,6 +504,11 @@ TEEC_Result OpteeRpcCmdFs(t_teesmc32_arg *TeeSmc32Arg)
TEEC_Result TeecResult = TEEC_SUCCESS;
t_teesmc32_param *TeeSmc32Param;
+ if (check_security_exist(0) < 0) {
+ printf("security partition not exist! unable to use RK FS!\n");
+ return TEEC_ERROR_GENERIC;
+ }
+
TeeSmc32Param = TEESMC32_GET_PARAMS(TeeSmc32Arg);
#ifdef CONFIG_OPTEE_V1
TeecResult = tee_supp_rk_fs_process((void *)(size_t)TeeSmc32Param[0].u.memref.buf_ptr,
diff --git a/lib/optee_clientApi/OpteeClientRkFs-v2.c b/lib/optee_clientApi/OpteeClientRkFs-v2.c
index 18be31a61f..ce826d25d5 100644
--- a/lib/optee_clientApi/OpteeClientRkFs-v2.c
+++ b/lib/optee_clientApi/OpteeClientRkFs-v2.c
@@ -98,7 +98,10 @@
* - 512 byte section used refs [128]
* - 1 byte = 2 flag
* - 895 * 512 byte data [129 - 1023]
- * ------------------------------
+ * ------ RKSS Backup Structure --------
+ * - 512 byte backup header [1024]
+ * - 1 * rkss_backup_verification + 31 * rkss_backup_info
+ * - 255 * 512 byte backup data [1025 - 1279]
*
*/
#define RKSS_DATA_SECTION_COUNT 1024
@@ -107,6 +110,26 @@
#define RKSS_EACH_FILEFOLDER_COUNT 4 /* 504 / 126 = 4*/
#define RKSS_NAME_MAX_LENGTH 117 /* 116 char + "\0"*/
#define RKSS_USEDFLAGS_INDEX RKSS_PARTITION_TABLE_COUNT
+#define RKSS_BACKUP_INDEX RKSS_DATA_SECTION_COUNT
+#define RKSS_BACKUP_COUNT 256
+
+#define RKSS_BACKUP_VERSION (unsigned int)0x1
+#define RKSS_BACKUP_ENABLE (unsigned int)0x55667788
+#define RKSS_BACKUP_USEDFLAG (unsigned int)0xAABBCCDD
+
+struct rkss_backup_verification {
+ unsigned int backup_version;
+ unsigned int backup_count;
+ unsigned int reserve;
+ unsigned int backup_enable;
+};
+
+struct rkss_backup_info {
+ unsigned int backup_index;
+ unsigned int backup_num;
+ unsigned int backup_data_index;
+ unsigned int backup_usedflag;
+};
#define RK_FS_R 0x1
#define RK_FS_W 0x2
@@ -151,48 +174,290 @@ static int dir_seek;
static struct blk_desc *dev_desc = NULL;
static disk_partition_t part_info;
-static int rkss_read_multi_sections(unsigned char *data, unsigned long index, unsigned int num)
-{
- unsigned long ret;
- if (dev_desc == NULL) {
+int check_security_exist(int print_flag)
+{
+ if (!dev_desc) {
dev_desc = rockchip_get_bootdev();
if (!dev_desc) {
printf("%s: Could not find device\n", __func__);
return -1;
}
- if (part_get_info_by_name(dev_desc, "security", &part_info) < 0) {
+ if (part_get_info_by_name(dev_desc,
+ "security", &part_info) < 0) {
dev_desc = NULL;
- printf("Could not find security partition\n");
+ if (print_flag != 0)
+ printf("Could not find security partition\n");
return -1;
}
}
- ret = blk_dread(dev_desc, part_info.start + index, num, data);
- if (ret != num) {
- printf("blk_dread fail\n");
+ return 0;
+}
+
+/*
+ * action1:
+ * rkss_begin_commit set enable flag
+ * rkss_backup_sections backup data
+ * blk_dwrite
+ * rkss_finish_commit clear enable flag, clear backup data
+ * reboot
+ * rkss_resume not find enable flag, do nothing
+ *
+ * action2:
+ * rkss_begin_commit set enable flag
+ * rkss_backup_sections backup data
+ * power off when blk_dwrite
+ *
+ * power on
+ * rkss_resume find enable flag, resume all backup data
+ */
+static int rkss_begin_commit(void)
+{
+ unsigned char data[RKSS_DATA_LEN];
+ struct rkss_backup_verification p;
+ unsigned long ret;
+
+ if (check_security_exist(1) < 0)
+ return -1;
+
+ debug("%s\n", __func__);
+ p.backup_version = RKSS_BACKUP_VERSION;
+ p.backup_enable = RKSS_BACKUP_ENABLE;
+ p.backup_count = 0;
+
+ memset(data, 0, sizeof(data));
+ memcpy(data, &p, sizeof(p));
+
+ ret = blk_dwrite(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dwrite fail\n");
return -1;
}
return 0;
}
-static int rkss_write_multi_sections(unsigned char *data, unsigned long index, unsigned int num)
+static int rkss_finish_commit(void)
{
+ unsigned char data[RKSS_DATA_LEN];
unsigned long ret;
- if (dev_desc == NULL) {
- dev_desc = rockchip_get_bootdev();
- if (!dev_desc) {
- printf("%s: Could not find device\n", __func__);
+ if (check_security_exist(1) < 0)
+ return -1;
+
+ debug("%s\n", __func__);
+ memset(data, 0, sizeof(data));
+
+ ret = blk_dwrite(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dwrite fail\n");
+ return -1;
+ }
+ return 0;
+}
+
+static int rkss_backup_sections(unsigned long index, unsigned int num)
+{
+ unsigned char data[RKSS_DATA_LEN];
+ unsigned char *backup_data = NULL;
+ struct rkss_backup_verification p;
+ struct rkss_backup_info info_last, info_current;
+ unsigned long ret;
+
+ if (check_security_exist(1) < 0)
+ return -1;
+
+ ret = blk_dread(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dread fail\n");
+ return -1;
+ }
+
+ memcpy(&p, data, sizeof(p));
+ if (p.backup_version == RKSS_BACKUP_VERSION &&
+ p.backup_enable == RKSS_BACKUP_ENABLE) {
+ if (p.backup_count == 0) {
+ info_current.backup_usedflag = RKSS_BACKUP_USEDFLAG;
+ info_current.backup_index = index;
+ info_current.backup_num = num;
+ info_current.backup_data_index = RKSS_BACKUP_INDEX + 1;
+ } else {
+ memcpy(&info_last, data + sizeof(p) +
+ (p.backup_count - 1) * sizeof(info_last),
+ sizeof(info_last));
+ info_current.backup_usedflag = RKSS_BACKUP_USEDFLAG;
+ info_current.backup_index = index;
+ info_current.backup_num = num;
+ info_current.backup_data_index =
+ info_last.backup_data_index +
+ info_last.backup_num;
+ }
+ if ((info_current.backup_data_index + info_current.backup_num) >
+ (RKSS_BACKUP_INDEX + RKSS_BACKUP_COUNT)) {
+ printf("Not enough backup sections!");
+ goto error;
+ }
+ debug("%s index=0x%lx num=0x%x backup_data_index=0x%x\n",
+ __func__, index, num, info_current.backup_data_index);
+
+ backup_data = malloc(num * RKSS_DATA_LEN);
+ if (!backup_data) {
+ printf("malloc backup_data fail\n");
+ goto error;
+ }
+
+ ret = blk_dread(dev_desc, index, num, backup_data);
+ if (ret != num) {
+ printf("blk_dread fail\n");
return -1;
}
- if (part_get_info_by_name(dev_desc, "security", &part_info) < 0) {
- dev_desc = NULL;
- printf("Could not find security partition\n");
+ ret = blk_dwrite(dev_desc, info_current.backup_data_index,
+ num, backup_data);
+ if (ret != num) {
+ printf("blk_dwrite fail\n");
return -1;
}
+ free(backup_data);
+ backup_data = NULL;
+
+ p.backup_count += 1;
+
+ memcpy(data, &p, sizeof(p));
+ memcpy(data + sizeof(p) +
+ (p.backup_count - 1) * sizeof(info_current),
+ &info_current, sizeof(info_current));
+
+ ret = blk_dwrite(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dwrite fail\n");
+ return -1;
+ }
+ }
+
+ return 0;
+error:
+ if (backup_data)
+ free(backup_data);
+ return -1;
+}
+
+static int rkss_resume(void)
+{
+ unsigned char data[RKSS_DATA_LEN];
+ unsigned char *backup_data = NULL;
+ struct rkss_backup_verification p;
+ struct rkss_backup_info info_current;
+ unsigned int i;
+ unsigned long ret;
+
+ if (check_security_exist(1) < 0)
+ return -1;
+
+ ret = blk_dread(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dread fail\n");
+ return -1;
+ }
+
+ memcpy(&p, data, sizeof(p));
+ if (p.backup_version == RKSS_BACKUP_VERSION &&
+ p.backup_enable == RKSS_BACKUP_ENABLE) {
+ for (i = p.backup_count; i > 0; i--) {
+ memcpy(&info_current, data + sizeof(p) + (i - 1) *
+ sizeof(info_current), sizeof(info_current));
+
+ if (info_current.backup_usedflag ==
+ RKSS_BACKUP_USEDFLAG) {
+ debug("rkss_resume backup_index=0x%x \
+ backup_num=0x%x \
+ info_current.backup_data_index=0x%x\n",
+ info_current.backup_index,
+ info_current.backup_num,
+ info_current.backup_data_index);
+ if ((info_current.backup_data_index +
+ info_current.backup_num) >
+ (RKSS_BACKUP_INDEX + RKSS_BACKUP_COUNT)) {
+ printf("backup sections error!");
+ goto error;
+ }
+ if ((info_current.backup_index +
+ info_current.backup_num) >
+ RKSS_DATA_SECTION_COUNT) {
+ printf("original sections error!");
+ goto error;
+ }
+ backup_data = malloc(info_current.backup_num *
+ RKSS_DATA_LEN);
+ if (!backup_data) {
+ printf("malloc backup_data fail\n");
+ goto error;
+ }
+
+ ret = blk_dread(dev_desc,
+ info_current.backup_data_index,
+ info_current.backup_num,
+ backup_data);
+ if (ret != info_current.backup_num) {
+ printf("blk_dread fail\n");
+ return -1;
+ }
+
+ ret = blk_dwrite(dev_desc,
+ info_current.backup_index,
+ info_current.backup_num,
+ backup_data);
+ if (ret != info_current.backup_num) {
+ printf("blk_dwrite fail\n");
+ return -1;
+ }
+ free(backup_data);
+ backup_data = NULL;
+ }
+ }
+ }
+ memset(data, 0, sizeof(data));
+ ret = blk_dwrite(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dwrite fail\n");
+ return -1;
}
+ return 0;
+error:
+ if (backup_data)
+ free(backup_data);
+ return -1;
+}
+
+static int rkss_read_multi_sections(unsigned char *data, unsigned long index, unsigned int num)
+{
+ unsigned long ret;
+
+ if (check_security_exist(1) < 0)
+ return -1;
+
+ ret = blk_dread(dev_desc, part_info.start + index, num, data);
+ if (ret != num) {
+ printf("blk_dread fail\n");
+ return -1;
+ }
+ return 0;
+}
+
+static int rkss_write_multi_sections(unsigned char *data, unsigned long index, unsigned int num)
+{
+ unsigned long ret;
+ int result;
+
+ result = rkss_backup_sections(index, num);
+ if (result < 0) {
+ printf("rkss_backup_sections fail\n");
+ return -1;
+ }
+
+ if (check_security_exist(1) < 0)
+ return -1;
+
ret = blk_dwrite(dev_desc, part_info.start + index, num, data);
if (ret != num) {
printf("blk_dwrite fail\n");
@@ -205,19 +470,9 @@ static int rkss_read_patition_tables(unsigned char *data)
{
unsigned long ret;
- if (dev_desc == NULL) {
- dev_desc = rockchip_get_bootdev();
- if (!dev_desc) {
- printf("%s: Could not find device\n", __func__);
- return -1;
- }
+ if (check_security_exist(1) < 0)
+ return -1;
- if (part_get_info_by_name(dev_desc, "security", &part_info) < 0) {
- dev_desc = NULL;
- printf("Could not find security partition\n");
- return -1;
- }
- }
ret = blk_dread(dev_desc, part_info.start, RKSS_PARTITION_TABLE_COUNT, data);
if (ret != RKSS_PARTITION_TABLE_COUNT) {
printf("blk_dread fail\n");
@@ -764,6 +1019,11 @@ static TEEC_Result ree_fs_new_create(size_t num_params,
/* file open flags: O_RDWR | O_CREAT | O_TRUNC
* if file exists, we must remove it first.
*/
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
filename = (char *)(size_t)params[1].u.memref.shm_id;
debug("params[1].u.memref.shm_id = 0x%llx params[1].u.memref.shm_offs = 0x%llx\n",
@@ -812,6 +1072,12 @@ static TEEC_Result ree_fs_new_create(size_t num_params,
debug("ree_fs_new_create ! %s, fd: %d.\n", filename, fd);
params[2].u.value.a = fd;
+
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return -1;
+ }
return TEEC_SUCCESS;
}
@@ -886,6 +1152,12 @@ static TEEC_Result ree_fs_new_write(size_t num_params,
int section_num;
uint8_t *file_data=0, *temp_file_data=0;
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
+
fd = params[0].u.value.b;
offs = params[0].u.value.c;
@@ -970,6 +1242,11 @@ out:
free(temp_file_data);
temp_file_data = 0;
}
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return -1;
+ }
return TEEC_SUCCESS;
}
@@ -983,6 +1260,12 @@ static TEEC_Result ree_fs_new_truncate(size_t num_params,
struct rkss_file_info p = {0};
unsigned int section_num_old, section_num_new;
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
+
fd = params[0].u.value.b;
len = params[0].u.value.c;
@@ -1010,6 +1293,11 @@ static TEEC_Result ree_fs_new_truncate(size_t num_params,
printf("ree_fs_new_truncate: write ptable error!\n");
return TEEC_ERROR_GENERIC;
}
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return -1;
+ }
return TEEC_SUCCESS;
}
@@ -1021,6 +1309,12 @@ static TEEC_Result ree_fs_new_remove(size_t num_params,
struct rkss_file_info p = {0};
int ret, fd, num;
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
+
debug("params[1].u.memref.shm_id = 0x%llx params[1].u.memref.shm_offs = 0x%llx\n",
params[1].u.memref.shm_id, params[1].u.memref.shm_offs);
@@ -1057,6 +1351,11 @@ static TEEC_Result ree_fs_new_remove(size_t num_params,
rkss_dump_ptable();
rkss_dump_usedflags();
#endif
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return -1;
+ }
return TEEC_SUCCESS;
}
@@ -1069,6 +1368,12 @@ static TEEC_Result ree_fs_new_rename(size_t num_params,
struct rkss_file_info p = {0};
int ret;
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
+
old_fname = (char *)(size_t)params[1].u.memref.shm_id;
debug("params[1].u.memref.shm_id = 0x%llx params[1].u.memref.shm_offs = 0x%llx\n",
params[1].u.memref.shm_id, params[1].u.memref.shm_offs);
@@ -1101,6 +1406,11 @@ static TEEC_Result ree_fs_new_rename(size_t num_params,
printf("write ptable error!\n");
return TEEC_ERROR_GENERIC;
}
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return -1;
+ }
return TEEC_SUCCESS;
}
@@ -1186,6 +1496,15 @@ int tee_supp_rk_fs_init(void)
struct rk_secure_storage rkss = {0};
unsigned char *table_data;
+ if (check_security_exist(0) < 0)
+ return 0;
+
+ ret = rkss_resume();
+ if (ret < 0) {
+ printf("rkss_resume failed!");
+ return TEEC_ERROR_GENERIC;
+ }
+
/* clean secure storage*/
#ifdef DEBUG_CLEAN_RKSS
int i = 0;
@@ -1196,6 +1515,11 @@ int tee_supp_rk_fs_init(void)
printf("cleaned [%d]", i);
}
#endif
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return TEEC_ERROR_GENERIC;
+ }
table_data = malloc(RKSS_DATA_LEN * RKSS_PARTITION_TABLE_COUNT);
if (table_data == NULL) {
@@ -1230,13 +1554,20 @@ int tee_supp_rk_fs_init(void)
rkss_dump_ptable();
rkss_dump_usedflags();
#endif
+
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return TEEC_ERROR_GENERIC;
+ }
+
return TEEC_SUCCESS;
}
-void OpteeClientRkFsInit(void)
+int OpteeClientRkFsInit(void)
{
debug(" OpteeClientRkFsInit\n");
- tee_supp_rk_fs_init();
+ return tee_supp_rk_fs_init();
}
bool tee_supp_param_is_value(struct tee_ioctl_param *param)
{
diff --git a/lib/optee_clientApi/OpteeClientRkFs.c b/lib/optee_clientApi/OpteeClientRkFs.c
index 55dec3e212..68c59554e8 100644
--- a/lib/optee_clientApi/OpteeClientRkFs.c
+++ b/lib/optee_clientApi/OpteeClientRkFs.c
@@ -99,7 +99,10 @@
* - 512 byte section used refs [128]
* - 1 byte = 2 flag
* - 895 * 512 byte data [129 - 1023]
- * ------------------------------
+ * ------ RKSS Backup Structure --------
+ * - 512 byte backup header [1024]
+ * - 1 * rkss_backup_verification + 31 * rkss_backup_info
+ * - 255 * 512 byte backup data [1025 - 1279]
*
*/
#define RKSS_DATA_SECTION_COUNT 1024
@@ -108,6 +111,26 @@
#define RKSS_EACH_FILEFOLDER_COUNT 4 // 504 / 126 = 4
#define RKSS_NAME_MAX_LENGTH 117 // 116 char + "\0"
#define RKSS_USEDFLAGS_INDEX RKSS_PARTITION_TABLE_COUNT
+#define RKSS_BACKUP_INDEX RKSS_DATA_SECTION_COUNT
+#define RKSS_BACKUP_COUNT 256
+
+#define RKSS_BACKUP_VERSION (unsigned int)0x1
+#define RKSS_BACKUP_ENABLE (unsigned int)0x55667788
+#define RKSS_BACKUP_USEDFLAG (unsigned int)0xAABBCCDD
+
+struct rkss_backup_verification {
+ unsigned int backup_version;
+ unsigned int backup_count;
+ unsigned int reserve;
+ unsigned int backup_enable;
+};
+
+struct rkss_backup_info {
+ unsigned int backup_index;
+ unsigned int backup_num;
+ unsigned int backup_data_index;
+ unsigned int backup_usedflag;
+};
typedef struct rkss_file_info
{
@@ -163,23 +186,268 @@ extern unsigned long blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
static struct blk_desc *dev_desc = NULL;
static disk_partition_t part_info;
-static int rkss_read_multi_sections(unsigned char *data, unsigned long index, unsigned int num)
-{
- unsigned long ret;
- if (dev_desc == NULL) {
+int check_security_exist(int print_flag)
+{
+ if (!dev_desc) {
dev_desc = rockchip_get_bootdev();
if (!dev_desc) {
printf("%s: Could not find device\n", __func__);
return -1;
}
- if (part_get_info_by_name(dev_desc, "security", &part_info) < 0) {
+ if (part_get_info_by_name(dev_desc,
+ "security", &part_info) < 0) {
dev_desc = NULL;
- printf("Could not find security partition\n");
+ if (print_flag != 0)
+ printf("Could not find security partition\n");
+ return -1;
+ }
+ }
+ return 0;
+}
+
+/*
+ * action1:
+ * rkss_begin_commit set enable flag
+ * rkss_backup_sections backup data
+ * blk_dwrite
+ * rkss_finish_commit clear enable flag, clear backup data
+ * reboot
+ * rkss_resume not find enable flag, do nothing
+ *
+ * action2:
+ * rkss_begin_commit set enable flag
+ * rkss_backup_sections backup data
+ * power off when blk_dwrite
+ *
+ * power on
+ * rkss_resume find enable flag, resume all backup data
+ */
+static int rkss_begin_commit(void)
+{
+ unsigned char data[RKSS_DATA_LEN];
+ struct rkss_backup_verification p;
+ unsigned long ret;
+
+ if (check_security_exist(1) < 0)
+ return -1;
+
+ debug("%s\n", __func__);
+ p.backup_version = RKSS_BACKUP_VERSION;
+ p.backup_enable = RKSS_BACKUP_ENABLE;
+ p.backup_count = 0;
+
+ memset(data, 0, sizeof(data));
+ memcpy(data, &p, sizeof(p));
+
+ ret = blk_dwrite(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dwrite fail\n");
+ return -1;
+ }
+ return 0;
+}
+
+static int rkss_finish_commit(void)
+{
+ unsigned char data[RKSS_DATA_LEN];
+ unsigned long ret;
+
+ if (check_security_exist(1) < 0)
+ return -1;
+
+ debug("%s\n", __func__);
+ memset(data, 0, sizeof(data));
+
+ ret = blk_dwrite(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dwrite fail\n");
+ return -1;
+ }
+ return 0;
+}
+
+static int rkss_backup_sections(unsigned long index, unsigned int num)
+{
+ unsigned char data[RKSS_DATA_LEN];
+ unsigned char *backup_data = NULL;
+ struct rkss_backup_verification p;
+ struct rkss_backup_info info_last, info_current;
+ unsigned long ret;
+
+ if (check_security_exist(1) < 0)
+ return -1;
+
+ ret = blk_dread(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dread fail\n");
+ return -1;
+ }
+
+ memcpy(&p, data, sizeof(p));
+ if (p.backup_version == RKSS_BACKUP_VERSION &&
+ p.backup_enable == RKSS_BACKUP_ENABLE) {
+ if (p.backup_count == 0) {
+ info_current.backup_usedflag = RKSS_BACKUP_USEDFLAG;
+ info_current.backup_index = index;
+ info_current.backup_num = num;
+ info_current.backup_data_index = RKSS_BACKUP_INDEX + 1;
+ } else {
+ memcpy(&info_last,
+ data + sizeof(p) + (p.backup_count - 1) *
+ sizeof(info_last), sizeof(info_last));
+ info_current.backup_usedflag = RKSS_BACKUP_USEDFLAG;
+ info_current.backup_index = index;
+ info_current.backup_num = num;
+ info_current.backup_data_index =
+ info_last.backup_data_index +
+ info_last.backup_num;
+ }
+ if ((info_current.backup_data_index + info_current.backup_num) >
+ (RKSS_BACKUP_INDEX + RKSS_BACKUP_COUNT)) {
+ printf("Not enough backup sections!");
+ goto error;
+ }
+ debug("%s index=0x%lx num=0x%x backup_data_index=0x%x\n",
+ __func__, index, num, info_current.backup_data_index);
+
+ backup_data = malloc(num * RKSS_DATA_LEN);
+ if (!backup_data) {
+ printf("malloc backup_data fail\n");
+ goto error;
+ }
+
+ ret = blk_dread(dev_desc, index, num, backup_data);
+ if (ret != num) {
+ printf("blk_dread fail\n");
+ return -1;
+ }
+
+ ret = blk_dwrite(dev_desc, info_current.backup_data_index,
+ num, backup_data);
+ if (ret != num) {
+ printf("blk_dwrite fail\n");
+ return -1;
+ }
+ free(backup_data);
+ backup_data = NULL;
+
+ p.backup_count += 1;
+
+ memcpy(data, &p, sizeof(p));
+ memcpy(data + sizeof(p) +
+ (p.backup_count - 1) * sizeof(info_current),
+ &info_current, sizeof(info_current));
+
+ ret = blk_dwrite(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dwrite fail\n");
return -1;
}
}
+
+ return 0;
+error:
+ if (backup_data)
+ free(backup_data);
+ return -1;
+}
+
+static int rkss_resume(void)
+{
+ unsigned char data[RKSS_DATA_LEN];
+ unsigned char *backup_data = NULL;
+ struct rkss_backup_verification p;
+ struct rkss_backup_info info_current;
+ unsigned int i;
+ unsigned long ret;
+
+ if (check_security_exist(1) < 0)
+ return -1;
+
+ ret = blk_dread(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dread fail\n");
+ return -1;
+ }
+
+ memcpy(&p, data, sizeof(p));
+ if (p.backup_version == RKSS_BACKUP_VERSION &&
+ p.backup_enable == RKSS_BACKUP_ENABLE) {
+ for (i = p.backup_count; i > 0; i--) {
+ memcpy(&info_current, data + sizeof(p) + (i - 1) *
+ sizeof(info_current), sizeof(info_current));
+
+ if (info_current.backup_usedflag ==
+ RKSS_BACKUP_USEDFLAG) {
+ debug("rkss_resume backup_index=0x%x \
+ backup_num=0x%x \
+ info_current.backup_data_index=0x%x\n",
+ info_current.backup_index,
+ info_current.backup_num,
+ info_current.backup_data_index);
+ if ((info_current.backup_data_index +
+ info_current.backup_num) >
+ (RKSS_BACKUP_INDEX + RKSS_BACKUP_COUNT)) {
+ printf("backup sections error!");
+ goto error;
+ }
+ if ((info_current.backup_index +
+ info_current.backup_num) >
+ RKSS_DATA_SECTION_COUNT) {
+ printf("original sections error!");
+ goto error;
+ }
+ backup_data = malloc(info_current.backup_num *
+ RKSS_DATA_LEN);
+ if (!backup_data) {
+ printf("malloc backup_data fail\n");
+ goto error;
+ }
+
+ ret = blk_dread(dev_desc,
+ info_current.backup_data_index,
+ info_current.backup_num,
+ backup_data);
+ if (ret != info_current.backup_num) {
+ printf("blk_dread fail\n");
+ return -1;
+ }
+
+ ret = blk_dwrite(dev_desc,
+ info_current.backup_index,
+ info_current.backup_num,
+ backup_data);
+ if (ret != info_current.backup_num) {
+ printf("blk_dwrite fail\n");
+ return -1;
+ }
+ free(backup_data);
+ backup_data = NULL;
+ }
+ }
+ }
+ memset(data, 0, sizeof(data));
+ ret = blk_dwrite(dev_desc, RKSS_BACKUP_INDEX, 1, data);
+ if (ret != 1) {
+ printf("blk_dwrite fail\n");
+ return -1;
+ }
+ return 0;
+error:
+ if (backup_data)
+ free(backup_data);
+ return -1;
+}
+
+static int rkss_read_multi_sections(unsigned char *data, unsigned long index, unsigned int num)
+{
+ unsigned long ret;
+
+ if (check_security_exist(1) < 0)
+ return -1;
+
ret = blk_dread(dev_desc, part_info.start + index, num, data);
if (ret != num) {
printf("blk_dread fail\n");
@@ -196,20 +464,17 @@ static int rkss_read_section(struct rk_secure_storage *rkss)
static int rkss_write_multi_sections(unsigned char *data, unsigned long index, unsigned int num)
{
unsigned long ret;
+ int result;
- if (dev_desc == NULL) {
- dev_desc = rockchip_get_bootdev();
- if (!dev_desc) {
- printf("%s: Could not find device\n", __func__);
- return -1;
- }
-
- if (part_get_info_by_name(dev_desc, "security", &part_info) < 0) {
- dev_desc = NULL;
- printf("Could not find security partition\n");
- return -1;
- }
+ result = rkss_backup_sections(index, num);
+ if (result < 0) {
+ printf("rkss_backup_sections fail\n");
+ return -1;
}
+
+ if (check_security_exist(1) < 0)
+ return -1;
+
ret = blk_dwrite(dev_desc, part_info.start + index, num, data);
if (ret != num) {
printf("blk_dwrite fail\n");
@@ -227,19 +492,9 @@ static int rkss_read_patition_tables(unsigned char *data)
{
unsigned long ret;
- if (dev_desc == NULL) {
- dev_desc = rockchip_get_bootdev();
- if (!dev_desc) {
- printf("%s: Could not find device\n", __func__);
- return -1;
- }
+ if (check_security_exist(1) < 0)
+ return -1;
- if (part_get_info_by_name(dev_desc, "security", &part_info) < 0) {
- dev_desc = NULL;
- printf("Could not find security partition\n");
- return -1;
- }
- }
ret = blk_dread(dev_desc, part_info.start, RKSS_PARTITION_TABLE_COUNT, data);
if (ret != RKSS_PARTITION_TABLE_COUNT) {
printf("blk_dread fail\n");
@@ -549,7 +804,7 @@ static int rkss_get_dirs_by_name(char* filename)
{
char *file = p->name + strlen(filename) + 1;
char *subdir = strtok(file, "/");
- printf("found: %s", subdir);
+ debug("found: %s", subdir);
strcpy(dir_cache[dir_num], subdir);
++dir_num;
}
@@ -801,6 +1056,12 @@ static int tee_fs_open(struct tee_fs_rpc *fsrpc)
}
}
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
+
if (make_newfile)
{
if (CHECKFLAG(fsrpc->flags, TEE_FS_O_CREAT))
@@ -830,6 +1091,12 @@ static int tee_fs_open(struct tee_fs_rpc *fsrpc)
debug("tee_fs_open ! %s , fd:%d, flag: %x, len: %d\n",
filename, fsrpc->fd, fsrpc->flags, fsrpc->len);
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return -1;
+ }
+
return fsrpc->fd;
}
@@ -901,6 +1168,12 @@ static int tee_fs_write(struct tee_fs_rpc *fsrpc)
return -1;
}
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
+
p.size = fsrpc->len;
int num = fsrpc->len / RKSS_DATA_LEN + 1;
p.index = rkss_get_empty_section_from_usedflags(num);
@@ -930,6 +1203,13 @@ static int tee_fs_write(struct tee_fs_rpc *fsrpc)
#ifdef DEBUG_RKFSS
rkss_dump_usedflags();
#endif
+
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return -1;
+ }
+
return fsrpc->len;
}
@@ -982,6 +1262,12 @@ static int tee_fs_unlink(struct tee_fs_rpc *fsrpc)
debug("tee_fs_unlink ! %s fd:%d index:%d size:%d\n", filename, fd, p.index, p.size);
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
+
/* decrease ref from usedflags */
int num = p.size / RKSS_DATA_LEN + 1;
ret = rkss_decref_multi_usedflags_sections(p.index, num);
@@ -1004,6 +1290,12 @@ static int tee_fs_unlink(struct tee_fs_rpc *fsrpc)
rkss_dump_ptable();
#endif
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return -1;
+ }
+
return 0;
}
@@ -1024,11 +1316,16 @@ static int tee_fs_link(struct tee_fs_rpc *fsrpc)
struct rkss_file_info p_check = {0};
ret = rkss_get_fileinfo_by_name(newfilename, &p_check);
- if (!ret)
+ if (ret >= 0)
{
printf("file exist ! %s.\n", newfilename);
return -1;
}
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
struct rkss_file_info p_new = {0};
memcpy(&p_new, &p_old, sizeof(struct rkss_file_info));
@@ -1051,6 +1348,11 @@ static int tee_fs_link(struct tee_fs_rpc *fsrpc)
#ifdef DEBUG_RKFSS
rkss_dump_ptable();
#endif
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return -1;
+ }
return 0;
}
@@ -1069,6 +1371,12 @@ static int tee_fs_rename(struct tee_fs_rpc *fsrpc)
return -1;
}
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
+
strcpy(p.name, newnames);
ret = rkss_write_back_ptable(ret, &p);
@@ -1078,6 +1386,12 @@ static int tee_fs_rename(struct tee_fs_rpc *fsrpc)
return -1;
}
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return -1;
+ }
+
return 0;
}
@@ -1097,6 +1411,11 @@ static int tee_fs_truncate(struct tee_fs_rpc *fsrpc)
printf("fd unvailable!\n");
return -1;
}
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
p.size = fsrpc->arg;
ret = rkss_write_back_ptable(fsrpc->fd, &p);
@@ -1105,6 +1424,11 @@ static int tee_fs_truncate(struct tee_fs_rpc *fsrpc)
printf("tee_fs_write: write ptable error!\n");
return -1;
}
+ ret = rkss_finish_commit();
+ if (ret < 0) {
+ printf("rkss_finish_commit failed!");
+ return -1;
+ }
return 0;
}
@@ -1142,12 +1466,12 @@ static int tee_fs_closedir(struct tee_fs_rpc *fsrpc)
static int tee_fs_readdir(struct tee_fs_rpc *fsrpc)
{
char *dirname = (char *)(fsrpc + 1);
- printf("seek/num:%d/%d\n", dir_seek, dir_num);
+ debug("seek/num:%d/%d\n", dir_seek, dir_num);
if (dir_seek == dir_num)
{
dirname = NULL;
fsrpc->len = 0;
- printf("tee_fs_readdir: END\n");
+ debug("tee_fs_readdir: END\n");
return -1;
}
@@ -1220,6 +1544,16 @@ int tee_supp_rk_fs_init(void)
__maybe_unused int i = 0;
unsigned char *table_data;
+ int ret;
+
+ if (check_security_exist(0) < 0)
+ return 0;
+
+ ret = rkss_resume();
+ if (ret < 0) {
+ printf("rkss_resume failed!");
+ return -1;
+ }
#ifdef DEBUG_CLEAN_RKSS // clean secure storage
for (i = 0; i < RKSS_DATA_SECTION_COUNT; i++)
{
@@ -1231,13 +1565,19 @@ int tee_supp_rk_fs_init(void)
}
#endif
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
+
// Verify Partition Table
table_data = malloc(RKSS_DATA_LEN * RKSS_PARTITION_TABLE_COUNT);
if (table_data == NULL) {
printf("malloc table_data fail\n");
return -1;
}
- int ret = rkss_read_patition_tables(table_data);
+ ret = rkss_read_patition_tables(table_data);
if (ret < 0) {
printf("rkss_read_patition_tables fail ! ret: %d.\n", ret);
free(table_data);
@@ -1275,12 +1615,18 @@ int tee_supp_rk_fs_init(void)
rkss_dump_usedflags();
#endif
+ ret = rkss_begin_commit();
+ if (ret < 0) {
+ printf("rkss_begin_commit failed!");
+ return -1;
+ }
+
return 0;
}
-void OpteeClientRkFsInit(void)
+int OpteeClientRkFsInit(void)
{
debug(" OpteeClientRkFsInit\n");
- tee_supp_rk_fs_init();
+ return tee_supp_rk_fs_init();
}
static int rkss_step = 0;
diff --git a/lib/sysmem.c b/lib/sysmem.c
index 2549de95f2..952a5e1894 100644
--- a/lib/sysmem.c
+++ b/lib/sysmem.c
@@ -15,45 +15,38 @@ DECLARE_GLOBAL_DATA_PTR;
#define SYSMEM_ALLOC_ANYWHERE 0
#define SYSMEM_ALLOC_NO_ALIGN 1
-#ifndef CONFIG_SYS_STACK_SIZE
-#define CONFIG_SYS_STACK_SIZE SZ_2M
-#endif
-
-#define SIZE_MB(len) ((len) >> 20)
-#define SIZE_KB(len) (((len) % (1 << 20)) >> 10)
-
#define SYSMEM_I(fmt, args...) printf("Sysmem: "fmt, ##args)
#define SYSMEM_W(fmt, args...) printf("Sysmem Warn: "fmt, ##args)
#define SYSMEM_E(fmt, args...) printf("Sysmem Error: "fmt, ##args)
#define SYSMEM_D(fmt, args...) debug("Sysmem Debug: "fmt, ##args)
-static struct sysmem plat_sysmem; /* Global for platform */
-
-struct sysmem_check {
+struct memcheck {
uint32_t magic;
};
-static int sysmem_has_init(void)
-{
- if (!plat_sysmem.has_init) {
- SYSMEM_E("Framework is not initialized\n");
- return 0;
- }
+/* Global for platform, must in data section */
+struct sysmem plat_sysmem __section(".data") = {
+ .has_initf = false,
+ .has_initr = false,
+};
- return 1;
+bool sysmem_has_init(void)
+{
+ return gd->flags & GD_FLG_RELOC ?
+ plat_sysmem.has_initr : plat_sysmem.has_initf;
}
void sysmem_dump(void)
{
-#ifdef DEBUG
struct sysmem *sysmem = &plat_sysmem;
struct lmb *lmb = &sysmem->lmb;
- struct sysmem_property *prop;
- struct sysmem_check *check;
+ struct memblock *mem;
+ struct memcheck *check;
struct list_head *node;
ulong memory_size = 0;
ulong reserved_size = 0;
ulong allocated_size = 0;
+ bool overflow = false;
ulong i;
if (!sysmem_has_init())
@@ -62,12 +55,13 @@ void sysmem_dump(void)
printf("\nsysmem_dump_all:\n");
/* Memory pool */
- printf(" ------------------------------------------------------\n");
+ printf(" --------------------------------------------------------------------\n");
for (i = 0; i < lmb->memory.cnt; i++) {
memory_size += lmb->memory.region[i].size;
- printf(" memory.rgn[%ld].base = 0x%08lx\n", i,
- (ulong)lmb->memory.region[i].base);
- printf(" .size = 0x%08lx\n",
+ printf(" memory.rgn[%ld].addr = 0x%08lx - 0x%08lx (size: 0x%08lx)\n", i,
+ (ulong)lmb->memory.region[i].base,
+ (ulong)lmb->memory.region[i].base +
+ (ulong)lmb->memory.region[i].size,
(ulong)lmb->memory.region[i].size);
}
printf("\n memory.total = 0x%08lx (%ld MiB. %ld KiB)\n",
@@ -75,54 +69,48 @@ void sysmem_dump(void)
SIZE_MB((ulong)memory_size),
SIZE_KB((ulong)memory_size));
- /* Reserved */
- i = 0;
- printf(" ------------------------------------------------------\n");
- list_for_each(node, &sysmem->reserved_head) {
- prop = list_entry(node, struct sysmem_property, node);
- reserved_size += prop->size;
- printf(" reserved.rgn[%ld].name = \"%s\"\n", i, prop->name);
- printf(" .base = 0x%08lx\n",
- (ulong)prop->base);
- printf(" .size = 0x%08lx\n",
- (ulong)prop->size);
- i++;
- }
- printf("\n reserved.total = 0x%08lx (%ld MiB. %ld KiB)\n",
- (ulong)reserved_size,
- SIZE_MB((ulong)reserved_size),
- SIZE_KB((ulong)reserved_size));
-
/* Allocated */
i = 0;
- printf(" ------------------------------------------------------\n");
+ printf(" --------------------------------------------------------------------\n");
list_for_each(node, &sysmem->allocated_head) {
- prop = list_entry(node, struct sysmem_property, node);
- allocated_size += prop->size;
- check = (struct sysmem_check *)
- (prop->base + prop->size - sizeof(*check));
- printf(" allocated.rgn[%ld].name = \"%s\"%s\n",
- i, prop->name,
- check->magic != SYSMEM_MAGIC ? " (Overflow)" : "");
- printf(" .base = 0x%08lx\n",
- (ulong)prop->base);
- printf(" .size = 0x%08lx\n",
- (ulong)prop->size);
+ mem = list_entry(node, struct memblock, node);
+ allocated_size += mem->size;
+ if (mem->attr.flags & M_ATTR_OFC) {
+ check = (struct memcheck *)
+ (mem->base + mem->size - sizeof(*check));
+ overflow = (check->magic != SYSMEM_MAGIC);
+ } else if (mem->attr.flags & M_ATTR_HOFC) {
+ check = (struct memcheck *)
+ (mem->base - sizeof(*check));
+ overflow = (check->magic != SYSMEM_MAGIC);
+ } else {
+ overflow = false;
+ }
+
+ printf(" allocated.rgn[%ld].name = \"%s\" %s\n",
+ i, mem->attr.name, overflow ? " <Overflow!>" : "");
+ printf(" .addr = 0x%08lx - 0x%08lx (size: 0x%08lx)\n",
+ (ulong)mem->base, (ulong)(mem->base + mem->size),
+ (ulong)mem->size);
i++;
}
+
+ printf("\n malloc_r: %d MiB, malloc_f: %d KiB\n",
+ SIZE_MB(CONFIG_SYS_MALLOC_LEN), SIZE_KB(CONFIG_SYS_MALLOC_F_LEN));
printf("\n allocated.total = 0x%08lx (%ld MiB. %ld KiB)\n",
(ulong)allocated_size,
SIZE_MB((ulong)allocated_size),
SIZE_KB((ulong)allocated_size));
/* LMB core reserved */
- printf(" ------------------------------------------------------\n");
+ printf(" --------------------------------------------------------------------\n");
reserved_size = 0;
for (i = 0; i < lmb->reserved.cnt; i++) {
reserved_size += lmb->reserved.region[i].size;
- printf(" LMB.reserved[%ld].base = 0x%08lx\n", i,
- (ulong)lmb->reserved.region[i].base);
- printf(" .size = 0x%08lx\n",
+ printf(" LMB.reserved[%ld].addr = 0x%08lx - 0x%08lx (size: 0x%08lx)\n", i,
+ (ulong)lmb->reserved.region[i].base,
+ (ulong)lmb->reserved.region[i].base +
+ (ulong)lmb->reserved.region[i].size,
(ulong)lmb->reserved.region[i].size);
}
@@ -130,167 +118,179 @@ void sysmem_dump(void)
(ulong)reserved_size,
SIZE_MB((ulong)reserved_size),
SIZE_KB((ulong)reserved_size));
- printf(" ------------------------------------------------------\n\n");
-#endif
-}
-
-int sysmem_check(void)
-{
- struct sysmem *sysmem = &plat_sysmem;
- struct sysmem_property *prop;
- struct sysmem_check *check;
- struct list_head *node;
- int ret = 0;
-
- if (!sysmem_has_init())
- return -ENOSYS;
-
- /* Check allocated */
- list_for_each(node, &sysmem->allocated_head) {
- prop = list_entry(node, struct sysmem_property, node);
- check = (struct sysmem_check *)
- (prop->base + prop->size - sizeof(*check));
- if (check->magic != SYSMEM_MAGIC) {
- ret = -EOVERFLOW;
- SYSMEM_E("\"%s\" (base=0x%08lx, size=0x%lx) is Overflow!\n",
- prop->name, (ulong)prop->base, (ulong)prop->size);
- }
- }
-
- /* Check stack */
- check = (struct sysmem_check *)(gd->start_addr_sp - CONFIG_SYS_STACK_SIZE);
- if (check->magic != SYSMEM_MAGIC) {
- ret = -EOVERFLOW;
- SYSMEM_E("Runtime stack is Overflow!\n");
- }
-
- return ret;
-}
-
-int sysmem_dump_check(void)
-{
- sysmem_dump();
-
- return sysmem_check();
+ printf(" --------------------------------------------------------------------\n\n");
}
-static int sysmem_is_overlap(phys_addr_t base1, phys_size_t size1,
- phys_addr_t base2, phys_size_t size2)
+static inline int sysmem_is_overlap(phys_addr_t base1, phys_size_t size1,
+ phys_addr_t base2, phys_size_t size2)
{
return ((base1 < (base2 + size2)) && (base2 < (base1 + size1)));
}
-int sysmem_add(phys_addr_t base, phys_size_t size)
+static int sysmem_add(phys_addr_t base, phys_size_t size)
{
struct sysmem *sysmem = &plat_sysmem;
int ret;
- if (!sysmem_has_init())
- return -ENOSYS;
+ if (!size)
+ return -EINVAL;
ret = lmb_add(&sysmem->lmb, base, size);
if (ret < 0)
- SYSMEM_E("Failed to add sysmem at 0x%lx for 0x%lx size\n",
+ SYSMEM_E("Failed to add sysmem at 0x%08lx for 0x%08lx size\n",
(ulong)base, (ulong)size);
return (ret >= 0) ? 0 : ret;
}
-int sysmem_reserve(const char *name, phys_addr_t base, phys_size_t size)
+static const char *sysmem_alias2name(const char *name, int *id)
{
- struct sysmem *sysmem = &plat_sysmem;
- struct sysmem_property *prop;
- struct list_head *node;
- int ret = 0;
-
- if (!sysmem_has_init())
- return -ENOSYS;
+ const char *alias;
+ int n, i, j;
+ int match = 0;
+
+ for (i = 0; i < MEMBLK_ID_MAX; i++) {
+ /* Pirmary name */
+ if (mem_attr[i].name && !strcasecmp(mem_attr[i].name, name)) {
+ match = 1;
+ goto finish;
+ }
- if (!name) {
- SYSMEM_E("NULL name for reserved sysmem\n");
- return -EINVAL;
- }
+ /* Alias name */
+ alias = mem_attr[i].alias[0];
+ if (!alias)
+ continue;
- /* Check overlap */
- list_for_each(node, &sysmem->reserved_head) {
- prop = list_entry(node, struct sysmem_property, node);
- if (!strcmp(prop->name, name)) {
- SYSMEM_E("Failed to double reserve for existence \"%s\"\n", name);
- return -EEXIST;
- } else if (sysmem_is_overlap(prop->base, prop->size, base, size)) {
- SYSMEM_D("\"%s\" (base=0x%08lx, size=0x%lx) reserve is "
- "overlap with existence \"%s\" (base=0x%08lx, size=0x%lx)\n",
- name, (ulong)base, (ulong)size, prop->name,
- (ulong)prop->base, (ulong)prop->size);
+ n = ARRAY_SIZE(mem_attr[i].alias);
+ for (j = 0; j < n; j++, alias++) {
+ if (alias && !strcasecmp(alias, name)) {
+ match = 1;
+ goto finish;
+ }
}
}
- ret = lmb_reserve(&sysmem->lmb, base, size);
- if (ret >= 0) {
- prop = malloc(sizeof(*prop));
- if (!prop) {
- SYSMEM_E("No memory for \"%s\" reserve sysmem\n", name);
- return -ENOMEM;
- }
-
- prop->name = name;
- prop->base = base;
- prop->size = size;
- list_add_tail(&prop->node, &sysmem->reserved_head);
- } else {
- SYSMEM_E("Failed to reserve \"%s\" at 0x%lx\n", name, (ulong)base);
- return -EINVAL;
+finish:
+ if (match) {
+ *id = i;
+ return mem_attr[i].name;
}
- return 0;
+ return name;
}
-void *sysmem_alloc_align_base(const char *name,
- phys_addr_t base,
- phys_size_t size,
- ulong align)
+static void *sysmem_alloc_align_base(enum memblk_id id,
+ const char *mem_name,
+ phys_addr_t base,
+ phys_size_t size,
+ ulong align)
{
struct sysmem *sysmem = &plat_sysmem;
- struct sysmem_property *prop;
- struct sysmem_check *check;
+ struct memblk_attr attr;
+ struct memblock *mem;
+ struct memcheck *check;
struct list_head *node;
+ const char *name;
phys_addr_t paddr;
phys_addr_t alloc_base;
phys_size_t alloc_size;
+ phys_addr_t bank_base;
+ phys_size_t bank_size;
+ bool req_overlap = false; /* Only for kernel reserved-memory */
+ int i;
if (!sysmem_has_init())
return NULL;
- if (!name) {
- SYSMEM_E("NULL name for alloc sysmem\n");
+ if (id == MEMBLK_ID_BY_NAME || id == MEMBLK_ID_FDT_RESV) {
+ if (!mem_name) {
+ SYSMEM_E("NULL name for alloc sysmem\n");
+ return NULL;
+ } else if (id == MEMBLK_ID_FDT_RESV) {
+ for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+ if (!gd->bd->bi_dram[i].size)
+ continue;
+
+ bank_base = gd->bd->bi_dram[i].start;
+ bank_size = gd->bd->bi_dram[i].size;
+ if (sysmem_is_overlap(base, size,
+ bank_base, bank_size)) {
+ req_overlap = true;
+ break;
+ }
+ }
+
+ if (!req_overlap)
+ return (void *)base;
+ }
+ name = sysmem_alias2name(mem_name, (int *)&id);
+ attr = mem_attr[id];
+ if (!attr.name)
+ attr.name = strdup(name);
+ } else if (id > MEMBLK_ID_UNK && id < MEMBLK_ID_MAX) {
+ attr = mem_attr[id];
+ name = attr.name;
+ } else {
+ SYSMEM_E("Unsupport memblk id %d for alloc sysmem\n", id);
+ return NULL;
+ }
+
+ if (!size) {
+ SYSMEM_E("\"%s\" size is 0 for alloc sysmem\n", name);
return NULL;
}
if (!IS_ALIGNED(base, 4)) {
- SYSMEM_E("\"%s\" base=0x%08lx is not 4-byte aligned\n", name, (ulong)base);
+ SYSMEM_E("\"%s\" base=0x%08lx is not 4-byte aligned\n",
+ name, (ulong)base);
return NULL;
}
/* Must be 4-byte aligned */
size = ALIGN(size, 4);
+ SYSMEM_D("Enter alloc: \"%s\" 0x%08lx - 0x%08lx\n",
+ name, (ulong)base, (ulong)(base + size));
+
/* Already allocated ? */
list_for_each(node, &sysmem->allocated_head) {
- prop = list_entry(node, struct sysmem_property, node);
- if (!strcmp(prop->name, name)) {
+ mem = list_entry(node, struct memblock, node);
+ SYSMEM_D("Has allcated: %s, 0x%08lx - 0x%08lx\n",
+ mem->attr.name, (ulong)mem->base,
+ (ulong)(mem->base + mem->size));
+ if (!strcmp(mem->attr.name, name)) {
+ if (mem->base <= base && mem->size >= size)
+ return (void *)base;
+
SYSMEM_E("Failed to double alloc for existence \"%s\"\n", name);
return NULL;
- } else if (sysmem_is_overlap(prop->base, prop->size, base, size)) {
- SYSMEM_E("\"%s\" (base=0x%08lx, size=0x%lx) alloc is "
- "overlap with existence \"%s\" (base=0x%08lx, size=0x%lx)\n",
- name, (ulong)base, (ulong)size,
- prop->name, (ulong)prop->base,
- (ulong)prop->size);
+ } else if (sysmem_is_overlap(mem->base, mem->size, base, size)) {
+ if (req_overlap && mem->attr.flags & M_ATTR_OVERLAP) {
+ if (lmb_reserve(&sysmem->lmb, base, size))
+ SYSMEM_E("Failed to overlap alloc \"%s\" "
+ "at 0x%08lx - 0x%08lx\n",
+ name, (ulong)base,
+ (ulong)(base + size));
+ return (void *)base;
+ }
+
+ SYSMEM_E("\"%s\" (0x%08lx - 0x%08lx) alloc is "
+ "overlap with existence \"%s\" (0x%08lx - "
+ "0x%08lx)\n",
+ name, (ulong)base, (ulong)(base + size),
+ mem->attr.name, (ulong)mem->base,
+ (ulong)(mem->base + mem->size));
return NULL;
}
}
- alloc_size = size + sizeof(*check);
+ /* Add overflow check magic ? */
+ if (attr.flags & M_ATTR_OFC)
+ alloc_size = size + sizeof(*check);
+ else
+ alloc_size = size;
+
+ /* Alloc anywhere ? */
if (base == SYSMEM_ALLOC_ANYWHERE)
alloc_base = base;
else
@@ -298,127 +298,170 @@ void *sysmem_alloc_align_base(const char *name,
paddr = lmb_alloc_base(&sysmem->lmb, alloc_size, align, alloc_base);
if (paddr) {
- if ((paddr == base) || (base == SYSMEM_ALLOC_ANYWHERE)) {
- prop = malloc(sizeof(*prop));
- if (!prop) {
+ if ((paddr == base) || (base == SYSMEM_ALLOC_ANYWHERE)) {
+ mem = malloc(sizeof(*mem));
+ if (!mem) {
SYSMEM_E("No memory for \"%s\" alloc sysmem\n", name);
return NULL;
}
- prop->name = name;
- prop->base = paddr;
- prop->size = alloc_size;
+ mem->base = paddr;
+ mem->size = alloc_size;
+ mem->attr = attr;
sysmem->allocated_cnt++;
-
- check = (struct sysmem_check *)(paddr + size);
- check->magic = SYSMEM_MAGIC;
-
- list_add_tail(&prop->node, &sysmem->allocated_head);
+ list_add_tail(&mem->node, &sysmem->allocated_head);
+
+ if (mem->attr.flags & M_ATTR_OFC) {
+ check = (struct memcheck *)(paddr + size);
+ check->magic = SYSMEM_MAGIC;
+ } else if (mem->attr.flags & M_ATTR_HOFC) {
+ check = (struct memcheck *)(paddr - sizeof(*check));
+ check->magic = SYSMEM_MAGIC;
+ }
} else {
- SYSMEM_E("Failed to alloc \"%s\" at expect 0x%lx but "
- "alloc at 0x%lx\n",
- name, (ulong)base, (ulong)paddr);
+ SYSMEM_E("Failed to alloc \"%s\" expect at 0x%08lx - 0x%08lx "
+ "but at 0x%08lx - x%08lx\n",
+ name, (ulong)base, (ulong)(base + size),
+ (ulong)paddr, (ulong)(paddr + size));
+ if (lmb_free(&sysmem->lmb, paddr, alloc_size))
+ SYSMEM_E("Failed to free \"%s\"\n", name);
+
return NULL;
}
} else {
- SYSMEM_E("Failed to alloc \"%s\" at 0x%lx\n", name, (ulong)base);
+ SYSMEM_E("Failed to alloc \"%s\" at 0x%08lx - 0x%08lx\n",
+ name, (ulong)base, (ulong)(base + size));
}
- SYSMEM_D("Alloc: \"%s\", paddr=0x%lx, size=0x%lx, align=0x%x, anywhere=%d\n",
+ SYSMEM_D("Exit alloc: \"%s\", paddr=0x%08lx, size=0x%08lx, align=0x%x, anywhere=%d\n",
name, (ulong)paddr, (ulong)size, (u32)align, !base);
return (void *)paddr;
}
-void *sysmem_alloc_align(const char *name, phys_size_t size, ulong align)
+void *sysmem_alloc_base(enum memblk_id id, phys_addr_t base, phys_size_t size)
{
- return sysmem_alloc_align_base(name,
- SYSMEM_ALLOC_ANYWHERE,
- size,
- align);
+ void *paddr;
+
+ paddr = sysmem_alloc_align_base(id,
+ NULL,
+ base,
+ size,
+ SYSMEM_ALLOC_NO_ALIGN);
+ if (!paddr)
+ sysmem_dump();
+
+ return paddr;
}
-void *sysmem_alloc_base(const char *name, phys_addr_t base, phys_size_t size)
+void *sysmem_alloc_base_by_name(const char *name,
+ phys_addr_t base, phys_size_t size)
{
- return sysmem_alloc_align_base(name,
- base,
- size,
- SYSMEM_ALLOC_NO_ALIGN);
+ void *paddr;
+
+ paddr = sysmem_alloc_align_base(MEMBLK_ID_BY_NAME,
+ name,
+ base,
+ size,
+ SYSMEM_ALLOC_NO_ALIGN);
+ if (!paddr)
+ sysmem_dump();
+
+ return paddr;
}
-void *sysmem_alloc(const char *name, phys_size_t size)
+void *sysmem_fdt_reserve_alloc_base(const char *name,
+ phys_addr_t base, phys_size_t size)
{
- return sysmem_alloc_align_base(name,
- SYSMEM_ALLOC_ANYWHERE,
- size,
- SYSMEM_ALLOC_NO_ALIGN);
+ void *paddr;
+
+ paddr = sysmem_alloc_align_base(MEMBLK_ID_FDT_RESV,
+ name,
+ base,
+ size,
+ SYSMEM_ALLOC_NO_ALIGN);
+ if (!paddr)
+ sysmem_dump();
+
+ return paddr;
}
int sysmem_free(phys_addr_t base)
{
struct sysmem *sysmem = &plat_sysmem;
- struct sysmem_property *prop;
+ struct memblock *mem;
struct list_head *node;
- int found = 0;
- int ret;
+ int ret, found = 0;
if (!sysmem_has_init())
return -ENOSYS;
/* Find existence */
list_for_each(node, &sysmem->allocated_head) {
- prop = list_entry(node, struct sysmem_property, node);
- if (prop->base == base) {
+ mem = list_entry(node, struct memblock, node);
+ if (mem->base == base) {
found = 1;
break;
}
}
if (!found) {
- SYSMEM_E("Failed to free no allocated sysmem at 0x%lx\n", (ulong)base);
+ SYSMEM_E("Failed to free no allocated sysmem at 0x%08lx\n",
+ (ulong)base);
return -EINVAL;
}
- ret = lmb_free(&sysmem->lmb, prop->base, prop->size);
+ ret = lmb_free(&sysmem->lmb, mem->base, mem->size);
if (ret >= 0) {
- SYSMEM_D("Free: \"%s\", paddr=0x%lx, size=0x%lx\n",
- prop->name, (ulong)prop->base, (ulong)prop->size);
+ SYSMEM_D("Free: \"%s\" 0x%08lx - 0x%08lx\n",
+ mem->attr.name, (ulong)mem->base,
+ (ulong)(mem->base + mem->size));
sysmem->allocated_cnt--;
- list_del(&prop->node);
- free(prop);
+ list_del(&mem->node);
+ free(mem);
} else {
- SYSMEM_E("Failed to free \"%s\" at 0x%lx\n", prop->name, (ulong)base);
+ SYSMEM_E("Failed to free \"%s\" at 0x%08lx\n",
+ mem->attr.name, (ulong)base);
}
return (ret >= 0) ? 0 : ret;
}
+int sysmem_initr(void)
+{
+ return sysmem_init();
+}
+
int sysmem_init(void)
{
struct sysmem *sysmem = &plat_sysmem;
- struct sysmem_check *check;
phys_addr_t mem_start;
phys_size_t mem_size;
int ret;
- SYSMEM_I("init\n");
-
lmb_init(&sysmem->lmb);
INIT_LIST_HEAD(&sysmem->allocated_head);
- INIT_LIST_HEAD(&sysmem->reserved_head);
sysmem->allocated_cnt = 0;
- sysmem->has_init = true;
+ if (gd->flags & GD_FLG_RELOC) {
+ sysmem->has_initr = true;
+ } else {
+ SYSMEM_I("init\n");
+ sysmem->has_initf = true;
+ }
/* Add all available system memory */
#ifdef CONFIG_NR_DRAM_BANKS
int i;
for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+ if (!gd->bd->bi_dram[i].size)
+ continue;
+
ret = sysmem_add(gd->bd->bi_dram[i].start,
gd->bd->bi_dram[i].size);
if (ret) {
SYSMEM_E("Failed to add sysmem from bi_dram[%d]\n", i);
- return ret;
+ goto fail;
}
}
#else
@@ -427,39 +470,44 @@ int sysmem_init(void)
ret = sysmem_add(mem_start, mem_size);
if (ret) {
SYSMEM_E("Failed to add sysmem from bootm_low/size\n");
- return ret;
+ goto fail;
}
#endif
-
- /* Reserved for arch */
- ret = arch_sysmem_reserve(sysmem);
- if (ret) {
- SYSMEM_E("Failed to reserve sysmem for arch\n");
- return ret;
- }
-
/* Reserved for board */
ret = board_sysmem_reserve(sysmem);
if (ret) {
SYSMEM_E("Failed to reserve sysmem for board\n");
- return ret;
+ goto fail;
}
- /* Reserved for U-boot framework 'reserve_xxx()' */
- mem_start = gd->start_addr_sp - CONFIG_SYS_STACK_SIZE;
+ /* Reserved for U-boot framework: 'reserve_xxx()' */
+ mem_start = gd->start_addr_sp;
mem_size = gd->ram_top - mem_start;
- check = (struct sysmem_check *)mem_start;
- check->magic = SYSMEM_MAGIC;
-
- ret = sysmem_reserve("U-Boot", mem_start, mem_size);
- if (ret) {
+ if (!sysmem_alloc_base(MEMBLK_ID_UBOOT, mem_start, mem_size)) {
SYSMEM_E("Failed to reserve sysmem for U-Boot framework\n");
- return ret;
+ ret = -ENOMEM;
+ goto fail;
}
- sysmem_dump();
+ /* Reserved for U-Boot stack */
+ mem_start = gd->start_addr_sp - CONFIG_SYS_STACK_SIZE;
+ mem_size = CONFIG_SYS_STACK_SIZE;
+ if (!sysmem_alloc_base(MEMBLK_ID_STACK, mem_start, mem_size)) {
+ SYSMEM_E("Failed to reserve sysmem for stack\n");
+ ret = -ENOMEM;
+ goto fail;
+ }
return 0;
+
+fail:
+ if (ret && !(gd->flags & GD_FLG_RELOC)) {
+ sysmem_dump();
+ SYSMEM_W("Maybe malloc size %d MiB is too large?\n\n",
+ SIZE_MB(CONFIG_SYS_MALLOC_LEN));
+ }
+
+ return ret;
}
__weak int board_sysmem_reserve(struct sysmem *sysmem)
@@ -468,8 +516,15 @@ __weak int board_sysmem_reserve(struct sysmem *sysmem)
return 0;
}
-__weak int arch_sysmem_reserve(struct sysmem *sysmem)
+static int do_dump_sysmem(cmd_tbl_t *cmdtp, int flag,
+ int argc, char *const argv[])
{
- /* please define platform specific arch_sysmem_reserve() */
+ sysmem_dump();
return 0;
}
+
+U_BOOT_CMD(
+ dump_sysmem, 1, 1, do_dump_sysmem,
+ "Dump sysmem layout",
+ ""
+);
diff --git a/make.sh b/make.sh
index fd9780c237..da072205b9 100755
--- a/make.sh
+++ b/make.sh
@@ -324,7 +324,7 @@ select_chip_info()
# - PX30, PX3SE
# - RK????, RK????X
# - RV????
- local chip_reg='^CONFIG_ROCKCHIP_[R,P][X,V,K][0-9ESX]{2,5}'
+ local chip_reg='^CONFIG_ROCKCHIP_[R,P][X,V,K][0-9ESX]{1,5}'
count=`egrep -c ${chip_reg} ${OUTDIR}/.config`
# Obtain the matching only
RKCHIP=`egrep -o ${chip_reg} ${OUTDIR}/.config`
@@ -345,6 +345,8 @@ select_chip_info()
&& RKCHIP=RK3326
grep '^CONFIG_ROCKCHIP_RK3128X=y' ${OUTDIR}/.config >/dev/null \
&& RKCHIP=RK3128X
+ grep '^CONFIG_ROCKCHIP_PX5=y' ${OUTDIR}/.config >/dev/null \
+ && RKCHIP=PX5
grep '^CONFIG_ROCKCHIP_RK3399PRO=y' ${OUTDIR}/.config >/dev/null \
&& RKCHIP=RK3399PRO
else
@@ -502,9 +504,29 @@ debug_command()
pack_uboot_image()
{
- local UBOOT_LOAD_ADDR
+ local UBOOT_LOAD_ADDR UBOOT_MAX_KB UBOOT_KB HEAD_KB=2
+ # Check file size
+ UBOOT_KB=`ls -l u-boot.bin | awk '{print $5}'`
+ if [ "$PLATFORM_UBOOT_IMG_SIZE" = "" ]; then
+ UBOOT_MAX_KB=1046528
+ else
+ UBOOT_MAX_KB=`echo $PLATFORM_UBOOT_IMG_SIZE | awk '{print strtonum($2)}'`
+ UBOOT_MAX_KB=$(((UBOOT_MAX_KB-HEAD_KB)*1024))
+ fi
+
+ if [ $UBOOT_KB -gt $UBOOT_MAX_KB ]; then
+ echo
+ echo "ERROR: pack uboot failed! u-boot.bin actual: $UBOOT_KB bytes, max limit: $UBOOT_MAX_KB bytes"
+ exit 1
+ fi
+
+ # Pack image
UBOOT_LOAD_ADDR=`sed -n "/CONFIG_SYS_TEXT_BASE=/s/CONFIG_SYS_TEXT_BASE=//p" ${OUTDIR}/include/autoconf.mk|tr -d '\r'`
+ if [ ! $UBOOT_LOAD_ADDR ]; then
+ UBOOT_LOAD_ADDR=`sed -n "/CONFIG_SYS_TEXT_BASE=/s/CONFIG_SYS_TEXT_BASE=//p" ${OUTDIR}/.config|tr -d '\r'`
+ fi
+
${RKTOOLS}/loaderimage --pack --uboot ${OUTDIR}/u-boot.bin uboot.img ${UBOOT_LOAD_ADDR} ${PLATFORM_UBOOT_IMG_SIZE}
# Delete u-boot.img and u-boot-dtb.img, which makes users not be confused with final uboot.img
@@ -521,17 +543,17 @@ pack_uboot_image()
pack_loader_image()
{
- local mode=$1 files ini
+ local mode=$1 files ini=${RKBIN}/RKBOOT/${RKCHIP_LOADER}MINIALL.ini
- if [ ! -f ${RKBIN}/RKBOOT/${RKCHIP_LOADER}MINIALL.ini ]; then
- echo "pack loader failed! Can't find: ${RKBIN}/RKBOOT/${RKCHIP_LOADER}MINIALL.ini"
+ if [ ! -f $ini ]; then
+ echo "pack loader failed! Can't find: $ini"
return
fi
cd ${RKBIN}
if [ "${mode}" = 'all' ]; then
- files=`ls ${RKBIN}/RKBOOT/${RKCHIP_LOADER}*MINIALL*.ini`
+ files=`ls ${RKBIN}/RKBOOT/${RKCHIP_LOADER}MINIALL*.ini`
for ini in $files
do
if [ -f "$ini" ]; then
@@ -540,8 +562,8 @@ pack_loader_image()
fi
done
else
- ${RKTOOLS}/boot_merger ${BIN_PATH_FIXUP} ${RKBIN}/RKBOOT/${RKCHIP_LOADER}MINIALL.ini
- echo "pack loader okay! Input: ${RKBIN}/RKBOOT/${RKCHIP_LOADER}MINIALL.ini"
+ ${RKTOOLS}/boot_merger ${BIN_PATH_FIXUP} $ini
+ echo "pack loader okay! Input: $ini"
fi
cd - && mv ${RKBIN}/*_loader_*.bin ./
@@ -586,16 +608,10 @@ pack_trust_image()
TOS=$(echo ${TOS} | sed "s/tools\/rk_tools\//\.\//g")
TOS_TA=$(echo ${TOS_TA} | sed "s/tools\/rk_tools\//\.\//g")
- if [ x$TOS_TA != x -a x$TOS != x ]; then
- ${RKTOOLS}/loaderimage --pack --trustos ${RKBIN}/${TOS} ./trust.img ${TEE_LOAD_ADDR} ${PLATFORM_TRUST_IMG_SIZE}
- ${RKTOOLS}/loaderimage --pack --trustos ${RKBIN}/${TOS_TA} ./trust_with_ta.img ${TEE_LOAD_ADDR} ${PLATFORM_TRUST_IMG_SIZE}
- echo "Both trust.img and trust_with_ta.img are ready"
- elif [ $TOS ]; then
- ${RKTOOLS}/loaderimage --pack --trustos ${RKBIN}/${TOS} ./trust.img ${TEE_LOAD_ADDR} ${PLATFORM_TRUST_IMG_SIZE}
- echo "trust.img is ready"
- elif [ $TOS_TA ]; then
+ if [ $TOS_TA ]; then
${RKTOOLS}/loaderimage --pack --trustos ${RKBIN}/${TOS_TA} ./trust.img ${TEE_LOAD_ADDR} ${PLATFORM_TRUST_IMG_SIZE}
- echo "trust.img with ta is ready"
+ elif [ $TOS ]; then
+ ${RKTOOLS}/loaderimage --pack --trustos ${RKBIN}/${TOS} ./trust.img ${TEE_LOAD_ADDR} ${PLATFORM_TRUST_IMG_SIZE}
else
echo "Can't find any tee bin"
exit 1
diff --git a/scripts/mkkrnlimg b/scripts/mkkrnlimg
new file mode 100755
index 0000000000..f8601d3ee0
--- /dev/null
+++ b/scripts/mkkrnlimg
Binary files differ
diff --git a/scripts/stacktrace.sh b/scripts/stacktrace.sh
index cb0383254d..39699499ef 100755
--- a/scripts/stacktrace.sh
+++ b/scripts/stacktrace.sh
@@ -41,13 +41,17 @@ do
cat u-boot.sym | sort |
awk -v foffset=$f_offset_hex '/\.text/ {
if (strtonum("0x"$1) > '$frame_pc_str') {
- printf("%s+0x%s/0x%x\n", fname, foffset, fsize);
+ printf("%s+0x%s/0x%x ", fname, foffset, fsize);
exit
}
fname=$NF;
fsize=strtonum("0x"$5);
fpc=strtonum("0x"$1);
}'
+
+ func_path=`./make.sh $frame_pc_str | awk '{ print $1 }' | sed -n "/home/p"`
+ func_path=`echo ${func_path##*boot/}`
+ echo $func_path
done
echo
diff --git a/tools/rockchip/boot_merger.c b/tools/rockchip/boot_merger.c
index fd8916e2ba..923bdb75ba 100644
--- a/tools/rockchip/boot_merger.c
+++ b/tools/rockchip/boot_merger.c
@@ -141,6 +141,11 @@ static inline void fixPath(char *path)
strcpy(tmp, end);
/* Terminate, so path can be dest for strcat() */
*start = '\0';
+ strcat(path, gNewPath);
+ strcat(path, tmp);
+ } else {
+ strcpy(tmp, path);
+ strcpy(path, gNewPath);
strcat(path, tmp);
}
}
@@ -308,7 +313,6 @@ static bool parseOut(FILE *file)
}
if (fscanf(file, OPT_OUT_PATH "=%[^\r^\n]", gOpts.outPath) != 1)
return false;
- fixPath(gOpts.outPath);
printf("out:%s\n", gOpts.outPath);
return true;
}
diff --git a/tools/rockchip/loaderimage.c b/tools/rockchip/loaderimage.c
index 1a98f72de9..534dd05149 100644
--- a/tools/rockchip/loaderimage.c
+++ b/tools/rockchip/loaderimage.c
@@ -229,7 +229,7 @@ int main(int argc, char *argv[])
fseek(fi, 0, SEEK_END);
size = ftell(fi);
fseek(fi, 0, SEEK_SET);
- printf("pack file size: %d \n", size);
+ printf("pack file size: %d(%d KB)\n", size, size / 1024);
if (size > max_size - sizeof(second_loader_hdr)) {
perror(file_out);
exit(EXIT_FAILURE);
diff --git a/tools/rockchip/trust_merger.c b/tools/rockchip/trust_merger.c
index b481321973..81e4da8a9b 100644
--- a/tools/rockchip/trust_merger.c
+++ b/tools/rockchip/trust_merger.c
@@ -102,6 +102,11 @@ static inline void fixPath(char *path)
strcpy(tmp, end);
/* Terminate, so path can be dest for strcat() */
*start = '\0';
+ strcat(path, gNewPath);
+ strcat(path, tmp);
+ } else {
+ strcpy(tmp, path);
+ strcpy(path, gNewPath);
strcat(path, tmp);
}
}
@@ -210,7 +215,6 @@ static bool parseOut(FILE *file)
}
if (fscanf(file, OPT_OUT_PATH "=%[^\r^\n]", gOpts.outPath) != 1)
return false;
- fixPath(gOpts.outPath);
printf("out:%s\n", gOpts.outPath);
return true;