From 562a66d432702328bc8db5f42bb5e5811788fec0 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Tue, 26 Feb 2019 22:12:27 +0800 Subject: cmd: fastboot: test the fastboot memory space availability Use the sysmem to test fastboot memory is available or not. Change-Id: I021152827b6948fabd5ea41e111ea20adf43167f Signed-off-by: Jason Zhu --- cmd/fastboot.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cmd/fastboot.c b/cmd/fastboot.c index 67aa7b8d7b..bb2f416b78 100644 --- a/cmd/fastboot.c +++ b/cmd/fastboot.c @@ -13,6 +13,7 @@ #include #include #include +#include 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("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); -- cgit v1.2.3 From a0bf35b5828e532111a10d1b90bf6e9d401ce4a4 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 11:20:44 +0800 Subject: mmc: rpmb: correct MMC_RSP_R1b to MMC_RSP_R1 According to eMMC spec, the resp_type of MMC_CMD_WRITE_MULTIPLE_BLOCK is MMC_RSP_R1 but not MMC_RSP_R1b. If use MMC_RSP_R1b, this causes rpmb can not work with sdhci drive. Change-Id: I02ab825a4a526646079be6a7ae27326d1a3b7acf Signed-off-by: Jason Zhu --- drivers/mmc/rpmb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; -- cgit v1.2.3 From 30431185982382875ae12b04d831bdf49fe4b712 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 28 Feb 2019 10:42:56 +0800 Subject: rockchip: rk3308: disable uart2-m1 configure when pre-loader serial enable pre-loader has configure it. Change-Id: I2786ff7c438a38036a7a5be3337052f7e51423a3 Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/rk3308/rk3308.c | 5 +++++ 1 file changed, 5 insertions(+) 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 #include +DECLARE_GLOBAL_DATA_PTR; + #ifdef CONFIG_ARM64 #include 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); -- cgit v1.2.3 From 785ce82a19631394ac43821e61acf483ee7600fa Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 28 Feb 2019 09:33:40 +0800 Subject: common: android: support misc partition absent Change-Id: Ida7780a1fd0981d8dbf01c0f25e283dfc6332eca Signed-off-by: Joseph Chen --- common/android_bootloader.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/common/android_bootloader.c b/common/android_bootloader.c index af912f98de..799963c573 100644 --- a/common/android_bootloader.c +++ b/common/android_bootloader.c @@ -878,7 +878,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 +895,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 -- cgit v1.2.3 From bdeba276114bfc536d5b80e1dcc28cfef9a5b3d9 Mon Sep 17 00:00:00 2001 From: Tony Xu Date: Tue, 5 Mar 2019 10:30:48 +0800 Subject: common: write_keybox: fix write attestation key compatibility error Using the same name when write key in new formation and old formation cause ta parse key data error when use key in old formation Change-Id: I7f83efc3672e903e608d89f7dc214465dc321502 Signed-off-by: Tony Xu --- common/attestation_key.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) 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); -- cgit v1.2.3 From 005d29a79d84659e0e26de97107a4a3a0a9a510f Mon Sep 17 00:00:00 2001 From: Wyon Bi Date: Mon, 4 Mar 2019 14:48:16 +0800 Subject: video/drm: rockchip_display: support get display mode from edid if client is not present Change-Id: Ib8956972b7bbb6aaaac2e3c8a93e0d38d98abf6a Signed-off-by: Wyon Bi --- drivers/video/drm/rockchip_display.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/drivers/video/drm/rockchip_display.c b/drivers/video/drm/rockchip_display.c index d5bf157274..9f8be7d2ba 100644 --- a/drivers/video/drm/rockchip_display.c +++ b/drivers/video/drm/rockchip_display.c @@ -465,8 +465,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 +483,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 +510,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 +563,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 +574,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) -- cgit v1.2.3 From a5e3baaa9355e34ae1ebb4a1e2394897f9332b49 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Mon, 4 Mar 2019 20:06:35 +0800 Subject: irq: disable all gpio interrupt by default Enable gpio irq only when child pin irq is request. Change-Id: I429839c7dcdcb90cfe58738eeb36c7445fb0152b Signed-off-by: Joseph Chen --- drivers/irq/irq-gpio-switch.h | 2 ++ drivers/irq/irq-gpio.c | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) 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); } } -- cgit v1.2.3 From 980e358fa0659ec03991f58d0a3b4d3d0007654f Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 17:56:21 +0800 Subject: configs: rk3036: add default CONFIG_FASTBOOT_BUF_ADDR The CONFIG_FASTBOOT_BUF_ADDR is 0x60800800. Change-Id: I56c6f5468271ca71fdf8f0b0c5ce6e6fa54fa259 Signed-off-by: Jason Zhu --- configs/evb-rk3036_defconfig | 1 + configs/rk3036_defconfig | 1 + 2 files changed, 2 insertions(+) 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/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 -- cgit v1.2.3 From 3420d534ce2da36e8ec56610f2d5c14bb8c02494 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 18:02:58 +0800 Subject: configs: rk3229: add default CONFIG_FASTBOOT_BUF_ADDR The CONFIG_FASTBOOT_BUF_ADDR is 0x60800800. Change-Id: I1fc730b09221d226dc38eb9880a6dd676c69a00d Signed-off-by: Jason Zhu --- configs/evb-rk3229_defconfig | 1 + configs/rk322x_defconfig | 1 + 2 files changed, 2 insertions(+) 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/rk322x_defconfig b/configs/rk322x_defconfig index cc18398c46..c7c22af77a 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 -- cgit v1.2.3 From 7a7d3f1dc947c36a36a3a748d09785c0bab760eb Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 18:07:55 +0800 Subject: rk3288: add default CONFIG_FASTBOOT_BUF_ADDR & CONFIG_FASTBOOT_BUF_SIZE The CONFIG_FASTBOOT_BUF_ADDR is 0x800800. The CONFIG_FASTBOOT_BUF_SIZE is 0x4000000. Change-Id: Ic70898f61daff16caebdfb94a7e40d45b3bd6359 Signed-off-by: Jason Zhu --- configs/evb-rk3288-rk1608_defconfig | 2 ++ configs/rk3288_defconfig | 2 ++ 2 files changed, 4 insertions(+) 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/rk3288_defconfig b/configs/rk3288_defconfig index e9e178100b..9f6672e555 100644 --- a/configs/rk3288_defconfig +++ b/configs/rk3288_defconfig @@ -17,6 +17,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_BOOTD is not set # CONFIG_CMD_ELF is not set # CONFIG_CMD_IMI is not set -- cgit v1.2.3 From ef6ed4129d66dfa78991d2cd4f421e4115705a1b Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 18:11:56 +0800 Subject: configs: rk3328: add default CONFIG_FASTBOOT_BUF_SIZE The CONFIG_FASTBOOT_BUF_SIZE is 0x4000000 Change-Id: I813a6b117bbce7029ffe76516ed12b4e0d1e0940 Signed-off-by: Jason Zhu --- configs/evb-rk3328_defconfig | 1 + configs/rk3328_defconfig | 1 + 2 files changed, 2 insertions(+) diff --git a/configs/evb-rk3328_defconfig b/configs/evb-rk3328_defconfig index 7bc65c73e5..2f2698ee51 100644 --- a/configs/evb-rk3328_defconfig +++ b/configs/evb-rk3328_defconfig @@ -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 diff --git a/configs/rk3328_defconfig b/configs/rk3328_defconfig index 998e53f9f9..b1b5bf7fd2 100644 --- a/configs/rk3328_defconfig +++ b/configs/rk3328_defconfig @@ -30,6 +30,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=0 # CONFIG_CMD_BDI is not set -- cgit v1.2.3 From 11980e05e6adfc08d0a48da9dd97cebc13268645 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 18:14:22 +0800 Subject: configs: rk3399: change the CONFIG_FASTBOOT_BUF_SIZE value Change the CONFIG_FASTBOOT_BUF_SIZE value to 0x4000000 Change-Id: Ic93057bf55b3ad6825650cd734c64826748e4a97 Signed-off-by: Jason Zhu --- configs/evb-rk3399_defconfig | 2 +- configs/rk3399_defconfig | 2 +- configs/rk3399pro_defconfig | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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/rk3399_defconfig b/configs/rk3399_defconfig index af958d7861..cc966e62a5 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 diff --git a/configs/rk3399pro_defconfig b/configs/rk3399pro_defconfig index 778f0964b5..7e6c7a5231 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 -- cgit v1.2.3 From 2fea0d71b52d427eebfa5714e98716bdc8531cce Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 19:26:11 +0800 Subject: configs: rv1108: change the CONFIG_FASTBOOT_BUF_SIZE value Change the CONFIG_FASTBOOT_BUF_SIZE value to 0x4000000. Change-Id: Ia591a0daba78330b9c407f6eb473751135fd8cdf Signed-off-by: Jason Zhu --- configs/evb-rv1108_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/evb-rv1108_defconfig b/configs/evb-rv1108_defconfig index 4afae952d0..8b3c477645 100644 --- a/configs/evb-rv1108_defconfig +++ b/configs/evb-rv1108_defconfig @@ -18,7 +18,7 @@ CONFIG_SPL_STACK_R=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 -- cgit v1.2.3 From 591a6a81959525226cb65b98043d85260d79d904 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 19:27:40 +0800 Subject: configs: rk1808: add default CONFIG_FASTBOOT_BUF_SIZE The CONFIG_FASTBOOT_BUF_SIZE is 0x04000000. Change-Id: Ic1da0b84fd84c328e062a278eda23c82525723f1 Signed-off-by: Jason Zhu --- configs/rk1808_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/rk1808_defconfig b/configs/rk1808_defconfig index 8ffec5633e..0f722cb02d 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 -- cgit v1.2.3 From 82be0dc462e47efa557e4155a594e01f7eb17e5e Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 19:29:08 +0800 Subject: configs: rk3128: add default CONFIG_FASTBOOT_BUF_ADDR The CONFIG_FASTBOOT_BUF_ADDR is 0x60800800. Change-Id: I14b9e6e28caf6309ac53f3096b3730d5851676dc Signed-off-by: Jason Zhu --- configs/rk3128x_defconfig | 1 + 1 file changed, 1 insertion(+) 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 -- cgit v1.2.3 From 7b2d6d6e23cf9b7359349883cfd2480d91c32247 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 28 Feb 2019 10:48:21 +0800 Subject: rockchip: atags: move error message to bad_magic() Change-Id: I4c41fa05361f4c8ad2e33530764c2ba5090aeb00 Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/rk_atags.c | 62 +++++++++++++-------------------------- 1 file changed, 20 insertions(+), 42 deletions(-) diff --git a/arch/arm/mach-rockchip/rk_atags.c b/arch/arm/mach-rockchip/rk_atags.c index cde2f23a3e..9c9adad3f7 100644 --- a/arch/arm/mach-rockchip/rk_atags.c +++ b/arch/arm/mach-rockchip/rk_atags.c @@ -72,11 +72,22 @@ void *memcpy(void *dest, const void *src, size_t count) } #endif -static int inline bad_magic(u32 magic) +static int bad_magic(u32 magic) { - return ((magic != ATAG_CORE) && - (magic != ATAG_NONE) && - (magic < ATAG_SERIAL || magic > ATAG_MAX)); + 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) @@ -99,15 +110,8 @@ int atags_set_tag(u32 magic, void *tagdata) 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 +129,8 @@ 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 (bad_magic(t->hdr.magic)) return -EINVAL; - } if (t->hdr.magic == ATAG_NONE) break; @@ -203,15 +194,8 @@ struct tag *atags_get_tag(u32 magic) 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 (bad_magic(t->hdr.magic)) return NULL; - } if (t->hdr.magic == magic) return t; @@ -235,11 +219,8 @@ void atags_stat(void) struct tag *t; 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 (bad_magic(t->hdr.magic)) return; - } in_use += (t->hdr.size << 2); } @@ -360,11 +341,8 @@ void atags_print_all_tags(void) struct tag *t; 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 (bad_magic(t->hdr.magic)) return; - } atags_print_tag(t); } -- cgit v1.2.3 From 716ab2e7e60a2ec837cf870216854108d7cf833f Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 28 Feb 2019 11:05:58 +0800 Subject: rockchip: atags: add tag overflow check when tag lookup Change-Id: I0fca9559a6656338e4c956bffa3734ff744dcc4c Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/rk_atags.c | 40 +++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-rockchip/rk_atags.c b/arch/arm/mach-rockchip/rk_atags.c index 9c9adad3f7..8b9b9273c6 100644 --- a/arch/arm/mach-rockchip/rk_atags.c +++ b/arch/arm/mach-rockchip/rk_atags.c @@ -95,6 +95,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; @@ -129,6 +146,9 @@ 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) { + if (atags_overflow(t)) + return -EINVAL; + if (bad_magic(t->hdr.magic)) return -EINVAL; @@ -159,16 +179,11 @@ int atags_set_tag(u32 magic, void *tagdata) 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; @@ -194,6 +209,9 @@ struct tag *atags_get_tag(u32 magic) return NULL; for_each_tag(t, (struct tag *)ATAGS_PHYS_BASE) { + if (atags_overflow(t)) + return NULL; + if (bad_magic(t->hdr.magic)) return NULL; @@ -219,6 +237,9 @@ void atags_stat(void) struct tag *t; for_each_tag(t, (struct tag *)ATAGS_PHYS_BASE) { + if (atags_overflow(t)) + return; + if (bad_magic(t->hdr.magic)) return; @@ -341,6 +362,9 @@ void atags_print_all_tags(void) struct tag *t; for_each_tag(t, (struct tag *)ATAGS_PHYS_BASE) { + if (atags_overflow(t)) + return; + if (bad_magic(t->hdr.magic)) return; -- cgit v1.2.3 From 2291ec7c6fbffd652da6118e45628578b7650a4a Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 1 Mar 2019 14:47:18 +0800 Subject: rockchip: atags: add JShash for tag Since atags is passed between so many pre-loader, it's better add hash check for tag. It compatibles with legacy code and tag data, because 'hash' is reserved field in old tag data. Change-Id: I18b4c46f75b2c5a50194c23576e6f1437c83ccf5 Signed-off-by: Joseph Chen --- arch/arm/include/asm/arch-rockchip/rk_atags.h | 21 ++++++--- arch/arm/mach-rockchip/rk_atags.c | 62 +++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 10 deletions(-) diff --git a/arch/arm/include/asm/arch-rockchip/rk_atags.h b/arch/arm/include/asm/arch-rockchip/rk_atags.h index 78c0039b1e..0d0c496f69 100644 --- a/arch/arm/include/asm/arch-rockchip/rk_atags.h +++ b/arch/arm/include/asm/arch-rockchip/rk_atags.h @@ -51,7 +51,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 +60,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 +88,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 +98,8 @@ struct tag_atf_mem { u64 phy_addr; u32 size; u32 flags; - u32 reserved[3]; + u32 reserved[2]; + u32 hash; } __packed; struct tag_ram_partition { @@ -105,7 +111,10 @@ struct tag_ram_partition { char name[16]; u64 start; u64 size; - } part[16]; + } part[6]; + + u32 reserved1[3]; + u32 hash; } __packed; struct tag_core { diff --git a/arch/arm/mach-rockchip/rk_atags.c b/arch/arm/mach-rockchip/rk_atags.c index 8b9b9273c6..b330a8c897 100644 --- a/arch/arm/mach-rockchip/rk_atags.c +++ b/arch/arm/mach-rockchip/rk_atags.c @@ -10,6 +10,7 @@ #include #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,6 +73,20 @@ void *memcpy(void *dest, const void *src, size_t count) } #endif +static u32 js_hash(void *buf, u32 len) +{ + 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; @@ -121,7 +136,7 @@ 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) @@ -152,6 +167,10 @@ int atags_set_tag(u32 magic, void *tagdata) 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; } @@ -188,8 +207,10 @@ int atags_set_tag(u32 magic, void *tagdata) /* 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); @@ -203,6 +224,7 @@ 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()) @@ -215,8 +237,25 @@ struct tag *atags_get_tag(u32 magic) if (bad_magic(t->hdr.magic)) return NULL; - if (t->hdr.magic == magic) + 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; @@ -236,6 +275,9 @@ 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 (atags_overflow(t)) return; @@ -275,6 +317,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"); @@ -287,6 +330,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"); @@ -305,6 +349,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"); @@ -316,6 +362,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"); @@ -326,11 +373,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"); @@ -341,6 +391,7 @@ 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_CORE: printf("[core]:\n"); @@ -361,6 +412,9 @@ void atags_print_all_tags(void) { struct tag *t; + if (!atags_is_available()) + return; + for_each_tag(t, (struct tag *)ATAGS_PHYS_BASE) { if (atags_overflow(t)) return; -- cgit v1.2.3 From 4454e90b43786bac3a0d4c3bfddeafddf794d6c0 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 20:09:50 +0800 Subject: lib: avb: change the output memssage I/O Since the stderr is not used in uboot, use printf to print the message. Change-Id: Ib522609e783acf8f407e2f9fb3805b553c543cba Signed-off-by: Jason Zhu --- lib/avb/libavb/avb_sysdeps_posix.c | 180 ++++++++++++++++++------------------- 1 file changed, 90 insertions(+), 90 deletions(-) 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 -#include -#include -#include -#include -#include -#include - -#include - -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 +#include +#include +#include +#include +#include +#include + +#include + +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; +} -- cgit v1.2.3 From 7cca3dd4d769349b982f1e5888599796d495c789 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 20:56:46 +0800 Subject: lib: avb: support last boot Change-Id: I803e3deda068be34061a302c27009db5e444f290 Signed-off-by: Jason Zhu --- include/android_avb/avb_ab_flow.h | 555 ++++++++--------- include/android_avb/rk_avb_ops_user.h | 8 + lib/avb/libavb_ab/avb_ab_flow.c | 1063 +++++++++++++++++---------------- lib/avb/rk_avb_user/rk_avb_ops_user.c | 37 +- 4 files changed, 853 insertions(+), 810 deletions(-) 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 - -#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 + +#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..c9f3cd7927 100644 --- a/include/android_avb/rk_avb_ops_user.h +++ b/include/android_avb/rk_avb_ops_user.h @@ -267,6 +267,14 @@ 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); + #ifdef __cplusplus } #endif 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 - -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, ¤t_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 + +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, ¤t_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/rk_avb_user/rk_avb_ops_user.c b/lib/avb/rk_avb_user/rk_avb_ops_user.c index b58a81fe95..3edd428f98 100644 --- a/lib/avb/rk_avb_user/rk_avb_ops_user.c +++ b/lib/avb/rk_avb_user/rk_avb_ops_user.c @@ -117,8 +117,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 +703,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; +} -- cgit v1.2.3 From 332992a7f2a4ec0f131d45858373de314b982144 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 21:17:02 +0800 Subject: android: minus retry in AB system Change-Id: Icc9764fb10dc87d3c4f2f7417b971338a7f98ca4 Signed-off-by: Jason Zhu --- common/android_bootloader.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/common/android_bootloader.c b/common/android_bootloader.c index 799963c573..a0e8921be5 100644 --- a/common/android_bootloader.c +++ b/common/android_bootloader.c @@ -919,10 +919,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) { -- cgit v1.2.3 From d2280c00f25bad13d014c7097b44649f98c4a96b Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 28 Feb 2019 21:53:57 +0800 Subject: android: add brackets to fix compile error There is a compile error when enable AB config. The error message is "error: a label can only be part of a statement and a declaration isnot a statement". Add brackets to fix this error. Change-Id: I4ec3af984503e35fc1304d08cd7cd8ab587dfb0a Signed-off-by: Jason Zhu --- common/android_bootloader.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/android_bootloader.c b/common/android_bootloader.c index a0e8921be5..58b3815475 100644 --- a/common/android_bootloader.c +++ b/common/android_bootloader.c @@ -969,7 +969,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="; @@ -979,6 +980,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 -- cgit v1.2.3 From 641abd2eec0219a9ae0f59014a15039601ba3e76 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 31 Jan 2019 21:30:25 +0800 Subject: rockchip: atags: pass public key through atags Change-Id: I202f354a3b48b8e64c7b2ade7e3b65fa3b78500a Signed-off-by: Jason Zhu --- arch/arm/include/asm/arch-rockchip/rk_atags.h | 10 ++++++++++ arch/arm/mach-rockchip/rk_atags.c | 13 +++++++++++++ 2 files changed, 23 insertions(+) diff --git a/arch/arm/include/asm/arch-rockchip/rk_atags.h b/arch/arm/include/asm/arch-rockchip/rk_atags.h index 0d0c496f69..20ada99821 100644 --- a/arch/arm/include/asm/arch-rockchip/rk_atags.h +++ b/arch/arm/include/asm/arch-rockchip/rk_atags.h @@ -17,6 +17,7 @@ #define ATAG_TOS_MEM 0x54410053 #define ATAG_RAM_PARTITION 0x54410054 #define ATAG_ATF_MEM 0x54410055 +#define ATAG_PUB_KEY 0x54410056 #define ATAG_MAX 0x544100ff /* Tag size and offset */ @@ -102,6 +103,14 @@ struct tag_atf_mem { u32 hash; } __packed; +struct tag_pub_key { + u32 version; + u32 len; + u8 data[768]; + u32 reserved[6]; + u32 hash; +} __packed; + struct tag_ram_partition { u32 version; u32 count; @@ -139,6 +148,7 @@ 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; } u; } __aligned(4); diff --git a/arch/arm/mach-rockchip/rk_atags.c b/arch/arm/mach-rockchip/rk_atags.c index b330a8c897..90a6e3ff89 100644 --- a/arch/arm/mach-rockchip/rk_atags.c +++ b/arch/arm/mach-rockchip/rk_atags.c @@ -196,6 +196,9 @@ 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; }; if (!size) @@ -393,6 +396,13 @@ void atags_print_tag(struct tag *t) 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_CORE: printf("[core]:\n"); printf(" magic = 0x%x\n", t->hdr.magic); @@ -434,6 +444,7 @@ 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; memset(&t_serial, 0x1, sizeof(t_serial)); memset(&t_bootdev, 0x2, sizeof(t_bootdev)); @@ -441,6 +452,7 @@ 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)); memcpy(&t_tos_mem.tee_mem.name, "tee_mem", 8); memcpy(&t_tos_mem.drm_mem.name, "drm_mem", 8); @@ -471,6 +483,7 @@ 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_print_all_tags(); atags_stat(); -- cgit v1.2.3 From 1927bb37f07b515f2d30b578a3234facd0ed159e Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 11:51:21 +0800 Subject: config: rk3399: clean up with make savedefconfig Change-Id: I8a9be3430eb224f8e3ea2dc957dca9439f4dd662 Signed-off-by: Joseph Chen --- configs/rk3399_defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/configs/rk3399_defconfig b/configs/rk3399_defconfig index cc966e62a5..7bc6d8ccb5 100755 --- a/configs/rk3399_defconfig +++ b/configs/rk3399_defconfig @@ -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 -- cgit v1.2.3 From cd8ac20fc3b7ad6e192fd678039ded8e7f3c041e Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 11:52:47 +0800 Subject: configs: rk3288: clean up with make savedefconfig Change-Id: Ib787733eef6e225c983a457d5719b5800e20d46a Signed-off-by: Joseph Chen --- configs/rk3288_defconfig | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/configs/rk3288_defconfig b/configs/rk3288_defconfig index 9f6672e555..4abb51d34e 100644 --- a/configs/rk3288_defconfig +++ b/configs/rk3288_defconfig @@ -13,6 +13,7 @@ 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 @@ -105,14 +106,12 @@ CONFIG_USE_TINY_PRINTF=y CONFIG_CMD_DHRYSTONE=y CONFIG_ERRNO_STR=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 -- cgit v1.2.3 From d06ecfaad6ea947d0c6eccaf93a92853770de456 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 11:54:54 +0800 Subject: configs: evb-px30: clean up with make savedefconfig Change-Id: I467ec09bda0bd4d2c12ef81ca139a1b67b4da932 Signed-off-by: Joseph Chen --- configs/evb-px30_defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/configs/evb-px30_defconfig b/configs/evb-px30_defconfig index 81f1884d78..06220ba79f 100644 --- a/configs/evb-px30_defconfig +++ b/configs/evb-px30_defconfig @@ -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 -- cgit v1.2.3 From b7d1cfcef7b73fcc6fb3a1cc33bc926e58a63496 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 11:56:03 +0800 Subject: configs: rk3326: clean up with make savedefconfig Change-Id: Ic34b6424d76743a54b74a59950a797cfdc08c034 Signed-off-by: Joseph Chen --- configs/evb-rk3326_defconfig | 1 - configs/rk3326_defconfig | 1 - 2 files changed, 2 deletions(-) diff --git a/configs/evb-rk3326_defconfig b/configs/evb-rk3326_defconfig index e9a9db9e24..2593b65933 100644 --- a/configs/evb-rk3326_defconfig +++ b/configs/evb-rk3326_defconfig @@ -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/rk3326_defconfig b/configs/rk3326_defconfig index ab40b9e0e4..4a80c269bd 100644 --- a/configs/rk3326_defconfig +++ b/configs/rk3326_defconfig @@ -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 -- cgit v1.2.3 From a050f450945ebaa1faa360216d6c686944e577c9 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 12:01:15 +0800 Subject: configs: rk3368: clean up with make savedefconfig Change-Id: I37708be8dafada4b58202602ab98195727d5e204 Signed-off-by: Joseph Chen --- configs/rk3368_defconfig | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/configs/rk3368_defconfig b/configs/rk3368_defconfig index 67b7d03ae7..3f59cb3922 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 @@ -55,7 +56,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 +100,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 -- cgit v1.2.3 From 92eec20f9179ac87d6c63bc0c9af665bc355cb1c Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 13:11:13 +0800 Subject: configs: rk322x: clean up with make savedefconfig Change-Id: I9105a5118f9658904d412e81cfa6286a4d33d3b4 Signed-off-by: Joseph Chen --- configs/rk322x_defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/configs/rk322x_defconfig b/configs/rk322x_defconfig index c7c22af77a..7ab87510ae 100644 --- a/configs/rk322x_defconfig +++ b/configs/rk322x_defconfig @@ -83,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 -- cgit v1.2.3 From 2a71d5332ec16049b6cb4324a1d17d2c785e03d3 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 14:06:55 +0800 Subject: configs: rk3126: clean up with make savedefconfig Change-Id: Ic87ede0857de720e7d228409df95abdf6142c70c Signed-off-by: Joseph Chen --- configs/rk3126_defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/configs/rk3126_defconfig b/configs/rk3126_defconfig index 447b70876f..08fcb9b572 100644 --- a/configs/rk3126_defconfig +++ b/configs/rk3126_defconfig @@ -54,7 +54,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 -- cgit v1.2.3 From 834f62e578a151ba39440f0d3164686312474aab Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 11:52:03 +0800 Subject: configs: rk3399: enable CONFIG_DOS_PARTITION for fat fs Change-Id: I5a03113550f164a3a4b25f04f07e072a117b5926 Signed-off-by: Joseph Chen --- configs/rk3399_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/rk3399_defconfig b/configs/rk3399_defconfig index 7bc6d8ccb5..ae4d35572b 100755 --- a/configs/rk3399_defconfig +++ b/configs/rk3399_defconfig @@ -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 -- cgit v1.2.3 From 27202cf9255531236ac583c5f359bf49d422b663 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 11:53:38 +0800 Subject: configs: rk3288: enable CONFIG_DOS_PARTITION for fat fs Change-Id: I45e8ed4c18288d4f845c786cdc577396271504f6 Signed-off-by: Joseph Chen --- configs/rk3288_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/rk3288_defconfig b/configs/rk3288_defconfig index 4abb51d34e..3e80f41644 100644 --- a/configs/rk3288_defconfig +++ b/configs/rk3288_defconfig @@ -39,7 +39,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 -- cgit v1.2.3 From db9bf7701edd1aa66ea2a1ae2fcbd615930aa907 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 11:54:31 +0800 Subject: configs: px30: enable CONFIG_DOS_PARTITION for fat fs Change-Id: I9fa31901e54f0c1883a84589d717651e7587f59c Signed-off-by: Joseph Chen --- configs/evb-px30_defconfig | 2 +- configs/px30_defconfig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configs/evb-px30_defconfig b/configs/evb-px30_defconfig index 06220ba79f..537eb862a0 100644 --- a/configs/evb-px30_defconfig +++ b/configs/evb-px30_defconfig @@ -49,7 +49,7 @@ 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_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/configs/px30_defconfig b/configs/px30_defconfig index 70f39c138d..fa6f3ca739 100644 --- a/configs/px30_defconfig +++ b/configs/px30_defconfig @@ -51,7 +51,7 @@ 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_SPL_DOS_PARTITION is not set # CONFIG_ISO_PARTITION is not set CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64 CONFIG_RKPARM_PARTITION=y -- cgit v1.2.3 From b08c9f9699ef875f725fe635a808524f72a510ad Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 11:58:41 +0800 Subject: configs: rk3326: enable CONFIG_DOS_PARTITION for fat fs Change-Id: Iefe882e6ff0738b3c22272bf284320c9934adb1f Signed-off-by: Joseph Chen --- configs/evb-rk3326_defconfig | 2 +- configs/rk3326_defconfig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configs/evb-rk3326_defconfig b/configs/evb-rk3326_defconfig index 2593b65933..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 diff --git a/configs/rk3326_defconfig b/configs/rk3326_defconfig index 4a80c269bd..b4e4487fff 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 -- cgit v1.2.3 From 4dc1628ce4572ea32a8511281a7bceb2d7707f01 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 13:10:05 +0800 Subject: configs: rk3368: enable CONFIG_DOS_PARTITION for fat fs Change-Id: Ie05cdec6c52c0173f2f8e8c2b3f47105b164f2c0 Signed-off-by: Joseph Chen --- configs/rk3368_defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/configs/rk3368_defconfig b/configs/rk3368_defconfig index 3f59cb3922..9dcdda9185 100644 --- a/configs/rk3368_defconfig +++ b/configs/rk3368_defconfig @@ -39,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 -- cgit v1.2.3 From 68373a9aa52803dd4f0c29948456759ffe399d73 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 13:11:57 +0800 Subject: configs: rk322x: enable CONFIG_DOS_PARTITION for fat fs Change-Id: I8435a6f1e0e802072279dabaa6887fd2f074a040 Signed-off-by: Joseph Chen --- configs/rk322x_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/rk322x_defconfig b/configs/rk322x_defconfig index 7ab87510ae..fd3f6306e0 100644 --- a/configs/rk322x_defconfig +++ b/configs/rk322x_defconfig @@ -53,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 -- cgit v1.2.3 From 688a40e1c9c8e2cc7a83a73c2c7373f3d9cb1fbc Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 14:07:39 +0800 Subject: configs: rk3126: enable CONFIG_DOS_PARTITION for fat fs Change-Id: I3837289269240d383bc3272840e6f27dd9406b00 Signed-off-by: Joseph Chen --- configs/rk3126_defconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/configs/rk3126_defconfig b/configs/rk3126_defconfig index 08fcb9b572..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 -- cgit v1.2.3 From 2b3bb4e5c81f7f8bf4032a32524624f8002e78fb Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 14:10:48 +0800 Subject: configs: rk3308: enable CONFIG_DOS_PARTITION for fat fs Change-Id: Ifb975cf96cdcc0d1d070bcc39bd4555828fb9fd0 Signed-off-by: Joseph Chen --- configs/rk3308-aarch32_defconfig | 1 - configs/rk3308_defconfig | 1 - 2 files changed, 2 deletions(-) diff --git a/configs/rk3308-aarch32_defconfig b/configs/rk3308-aarch32_defconfig index c1a2d8def6..956d0cd2aa 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 diff --git a/configs/rk3308_defconfig b/configs/rk3308_defconfig index 5be3f455a3..bacbaabd9d 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 -- cgit v1.2.3 From d08ece9d972be224bb5c7deae6b3788017ba2035 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 14:19:36 +0800 Subject: configs: rk3399pro: enable CONFIG_DOS_PARTITION for fat fs Change-Id: I02f68c31399b695a81705b53e8dad161d5366002 Signed-off-by: Joseph Chen --- configs/rk3399pro_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/rk3399pro_defconfig b/configs/rk3399pro_defconfig index 7e6c7a5231..95a3dc9559 100644 --- a/configs/rk3399pro_defconfig +++ b/configs/rk3399pro_defconfig @@ -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 -- cgit v1.2.3 From f4e1db9544a8994a69fe47e63f7735939641bbe4 Mon Sep 17 00:00:00 2001 From: Hisping Lin Date: Mon, 4 Mar 2019 10:35:12 +0800 Subject: lib: optee_client: add judgment of return value Change-Id: If616f89ffb2c3ea30afb7bced56a1ca28b1232b2 Signed-off-by: Hisping Lin --- cmd/optee.c | 12 +- include/optee_include/OpteeClientInterface.h | 2 +- include/optee_include/OpteeClientMem.h | 2 +- include/optee_include/OpteeClientRkFs-v2.h | 2 +- include/optee_include/OpteeClientRkFs.h | 2 +- lib/optee_clientApi/OpteeClientApiLib.c | 15 +- lib/optee_clientApi/OpteeClientInterface.c | 392 +++++++++++++++++++++------ lib/optee_clientApi/OpteeClientMem.c | 24 +- lib/optee_clientApi/OpteeClientRkFs-v2.c | 4 +- lib/optee_clientApi/OpteeClientRkFs.c | 4 +- 10 files changed, 354 insertions(+), 105 deletions(-) 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/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 -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..fa710adb7e 100644 --- a/include/optee_include/OpteeClientRkFs-v2.h +++ b/include/optee_include/OpteeClientRkFs-v2.h @@ -70,6 +70,6 @@ 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); #endif diff --git a/include/optee_include/OpteeClientRkFs.h b/include/optee_include/OpteeClientRkFs.h index d7f68bc277..ed91aa9c11 100644 --- a/include/optee_include/OpteeClientRkFs.h +++ b/include/optee_include/OpteeClientRkFs.h @@ -33,6 +33,6 @@ 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); #endif 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/OpteeClientRkFs-v2.c b/lib/optee_clientApi/OpteeClientRkFs-v2.c index 18be31a61f..b1f634997d 100644 --- a/lib/optee_clientApi/OpteeClientRkFs-v2.c +++ b/lib/optee_clientApi/OpteeClientRkFs-v2.c @@ -1233,10 +1233,10 @@ int tee_supp_rk_fs_init(void) 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..25a639c5a8 100644 --- a/lib/optee_clientApi/OpteeClientRkFs.c +++ b/lib/optee_clientApi/OpteeClientRkFs.c @@ -1277,10 +1277,10 @@ int tee_supp_rk_fs_init(void) 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; -- cgit v1.2.3 From 01ff14b05457e995a5eee4ce4173555171474a0f Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 6 Mar 2019 18:03:47 +0800 Subject: rockchip: resource: add return value validation Change-Id: I3ed362564e7aed48fc212f299f3712fdbc19ee53 Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/resource_img.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-rockchip/resource_img.c b/arch/arm/mach-rockchip/resource_img.c index 477aae70b2..fced26ff81 100755 --- a/arch/arm/mach-rockchip/resource_img.c +++ b/arch/arm/mach-rockchip/resource_img.c @@ -212,11 +212,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 +240,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 +280,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 +304,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 +314,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 +330,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); @@ -621,8 +635,11 @@ int rockchip_read_dtb_file(void *fdt_addr) char *dtb_name = DTB_FILE; int ret, size; - if (list_empty(&entrys_head)) - init_resource_list(NULL); + if (list_empty(&entrys_head)) { + ret = init_resource_list(NULL); + if (ret) + return ret; + } list_for_each(node, &entrys_head) { file = list_entry(node, struct resource_file, link); -- cgit v1.2.3 From aa0fd9f34b65b181c5a5baa7057017a139d16482 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Fri, 22 Feb 2019 21:22:14 +0800 Subject: rockchip: px30: add cd-gpios Add cd-gpios to test the mmc device whether exit. Change-Id: Ie1cfffe0f7826eae47fab705d3a3bb7d1a85f8ce Signed-off-by: Jason Zhu --- arch/arm/dts/px30.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm/dts/px30.dtsi b/arch/arm/dts/px30.dtsi index 668eb51257..a62bc03a1d 100644 --- a/arch/arm/dts/px30.dtsi +++ b/arch/arm/dts/px30.dtsi @@ -807,6 +807,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 = ; pinctrl-names = "default"; pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_det &sdmmc_bus4>; -- cgit v1.2.3 From b73a762978a1a7333b0979df5ed6a98418ccc485 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Fri, 22 Feb 2019 18:19:45 +0800 Subject: dts: rockchip: rk3288: add cd-gpios Add cd-gpios to test the mmc device whether exit. Change-Id: I3d4839180b36de22ce1e5f2b26c9090b0686a8a0 Signed-off-by: Jason Zhu --- arch/arm/dts/rk3288-u-boot.dtsi | 4 ++++ arch/arm/dts/rk3288.dtsi | 1 + 2 files changed, 5 insertions(+) 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 = ; reg = <0xff0c0000 0x4000>; status = "disabled"; -- cgit v1.2.3 From 18601cb12a0ced8c672542509b9c3a35fd935607 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Fri, 22 Feb 2019 21:46:04 +0800 Subject: rockchip: dts: rk3308: add cd-gpios Add cd-gpios to test the mmc device whether exit. Change-Id: I6a07ff130e506678a20e5128ef4c8e608e0ec448 Signed-off-by: Jason Zhu --- arch/arm/dts/rk3308-u-boot.dtsi | 5 +++++ arch/arm/dts/rk3308.dtsi | 1 + 2 files changed, 6 insertions(+) diff --git a/arch/arm/dts/rk3308-u-boot.dtsi b/arch/arm/dts/rk3308-u-boot.dtsi index 4da226322c..fae2d4fb07 100644 --- a/arch/arm/dts/rk3308-u-boot.dtsi +++ b/arch/arm/dts/rk3308-u-boot.dtsi @@ -83,6 +83,11 @@ status = "okay"; }; +&gpio0 { + u-boot,dm-pre-reloc; + status = "disabled"; +}; + &route_rgb { status = "disabled"; }; \ No newline at end of file diff --git a/arch/arm/dts/rk3308.dtsi b/arch/arm/dts/rk3308.dtsi index 1e9ec023e6..2d50ba881e 100644 --- a/arch/arm/dts/rk3308.dtsi +++ b/arch/arm/dts/rk3308.dtsi @@ -392,6 +392,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 = ; pinctrl-names = "default"; pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_bus4>; -- cgit v1.2.3 From 6f226dcaabe6011b2029079cbe04a3c0af083e00 Mon Sep 17 00:00:00 2001 From: Jon Lin Date: Wed, 23 Jan 2019 18:12:37 -0800 Subject: rkflash: change flash_read_page_raw return to error_ecc_bits 1.increase the number of read retry, Triggered only when the readout is wrong, so efficiency affects small 2.add nand buildin ecc support 3.skip ECC error block instead of marking as bad block 4.less debug printing 5.adjust the way of building tables to increase ftl init Change-Id: I9cbc369472740d472dfad29449d1fd6529cd9877 Signed-off-by: Jon Lin --- drivers/rkflash/flash.c | 73 +- drivers/rkflash/flash.h | 1 + drivers/rkflash/flash_com.h | 5 + drivers/rkflash/rk_sftl_arm_v7.S | 7486 +++++++++++++++++++------------------- drivers/rkflash/rk_sftl_arm_v8.S | 5307 ++++++++++++++------------- 5 files changed, 6513 insertions(+), 6359 deletions(-) diff --git a/drivers/rkflash/flash.c b/drivers/rkflash/flash.c index 71ed9694ad..c42e6d887f 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); @@ -490,6 +530,8 @@ u32 nandc_flash_init(void __iomem *nandc_addr) 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,8 +542,9 @@ 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; 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 + strh r3, [r5] @ movhi +.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 -- cgit v1.2.3 From 00e55222d361f674ec304d66029deb603bfe7bfc Mon Sep 17 00:00:00 2001 From: YouMin Chen Date: Fri, 15 Feb 2019 19:37:42 +0800 Subject: driver: ram: rk3399: clear interrupt before data training Clears the corresponding interrupt bit of the PI_INT_STATUS parameter before trigger data training. Change-Id: Ic25c952a19913cb4332b6cd3405f41474585bfb1 Signed-off-by: YouMin Chen --- drivers/ram/rockchip/sdram_rk3399.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 -- cgit v1.2.3 From 9b83ce70a95b30edde529fabddbbdb3fa91a7d3e Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Wed, 26 Dec 2018 09:20:23 +0800 Subject: lib: avb: add get&set perm-attr cer Change-Id: I89d3a30f43659ae8c9d107ede5db1590b022440d Signed-off-by: Jason Zhu --- include/android_avb/rk_avb_ops_user.h | 19 ++++++++++++++++++- lib/avb/rk_avb_user/rk_avb_ops_user.c | 24 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/include/android_avb/rk_avb_ops_user.h b/include/android_avb/rk_avb_ops_user.h index c9f3cd7927..39d0058824 100644 --- a/include/android_avb/rk_avb_ops_user.h +++ b/include/android_avb/rk_avb_ops_user.h @@ -267,7 +267,6 @@ 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 * @@ -275,6 +274,24 @@ int rk_generate_unlock_challenge(void *buffer, uint32_t *challenge_len); */ 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); + #ifdef __cplusplus } #endif 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 3edd428f98..2d4fea47ff 100644 --- a/lib/avb/rk_avb_user/rk_avb_ops_user.c +++ b/lib/avb/rk_avb_user/rk_avb_ops_user.c @@ -26,6 +26,30 @@ #include /* rk used */ +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; -- cgit v1.2.3 From 1f670f7cc95cbebf077a9cf2267f0b26240cde42 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Wed, 6 Mar 2019 18:18:10 +0800 Subject: lib: avb: get public key by atags Change-Id: I0d77229585263e81e8be4f5c67a02080c07b0e55 Signed-off-by: Jason Zhu --- include/android_avb/rk_avb_ops_user.h | 14 ++++++++++++++ lib/avb/rk_avb_user/rk_avb_ops_user.c | 13 +++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/android_avb/rk_avb_ops_user.h b/include/android_avb/rk_avb_ops_user.h index 39d0058824..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. @@ -292,6 +299,13 @@ int rk_avb_get_perm_attr_cer(uint8_t *cer, uint32_t 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/lib/avb/rk_avb_user/rk_avb_ops_user.c b/lib/avb/rk_avb_user/rk_avb_ops_user.c index 2d4fea47ff..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,21 @@ #include #include #include +#include /* 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 -- cgit v1.2.3 From 3cf641a8159f0c5ecdafbcabb79f501fc705ba87 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Wed, 26 Dec 2018 09:29:35 +0800 Subject: fastboot: support write&read perm attr rsa certificate Change-Id: Iab2ca981dedc188c61c60cd8cebd0f01c5896d44 Signed-off-by: Jason Zhu --- drivers/usb/gadget/f_fastboot.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index 6613935254..b6de1c37f6 100644 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c @@ -1841,6 +1841,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 +2099,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; -- cgit v1.2.3 From 65f0143b26988548b050df8ca33d26ed26938b0d Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Wed, 26 Dec 2018 15:59:57 +0800 Subject: lib: avb: verify the perm attr by root public key Change-Id: I7e06152a21325ffcd785223952fe8ffaff4d5f08 Signed-off-by: Jason Zhu --- lib/avb/libavb_atx/avb_atx_validate.c | 874 ++++++++++++++++++---------------- lib/avb/libavb_user/avb_ops_user.c | 2 + 2 files changed, 475 insertions(+), 401 deletions(-) mode change 100755 => 100644 lib/avb/libavb_atx/avb_atx_validate.c diff --git a/lib/avb/libavb_atx/avb_atx_validate.c b/lib/avb/libavb_atx/avb_atx_validate.c old mode 100755 new mode 100644 index 74a34fd0fd..c51a2bdd33 --- 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 - -#include -#include -#include -#include - -/* 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_CRYPTO_ROCKCHIP +#include +#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 ROCKCHIP_USE_PRE_LOADER_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/avb_ops_user.c b/lib/avb/libavb_user/avb_ops_user.c index ba20a41fc8..fca89265ae 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 ROCKCHIP_USE_PRE_LOADER_PUB_KEY #ifdef CONFIG_OPTEE_CLIENT if (trusty_read_attribute_hash((uint32_t *)hash, AVB_SHA256_DIGEST_SIZE / 4)) @@ -361,6 +362,7 @@ AvbIOResult avb_read_perm_attr_hash(AvbAtxOps *atx_ops, #else avb_error("Please open the macro!\n"); return -1; +#endif #endif return AVB_IO_RESULT_OK; } -- cgit v1.2.3 From 4701d790f43ded37aa9894938b721ab6c93c285c Mon Sep 17 00:00:00 2001 From: Andy Yan Date: Fri, 8 Mar 2019 15:58:26 +0800 Subject: cmd: bootrkp: return CMD_RET_FAILURE on error A cmd only returned with CMD_RET_XXX defined by command_ret_t can ensure it work well when called from shell. Change-Id: I16e76ed62928380eaaf3c352efb4df9463b7e72d Signed-off-by: Andy Yan --- cmd/bootrkp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 -- cgit v1.2.3 From d17dc7d4856a6600634a6360969468c49240dab6 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 8 Mar 2019 15:02:36 +0800 Subject: Revert "rockchip: dts: rk3308: add cd-gpios" This reverts commit 18601cb12a0ced8c672542509b9c3a35fd935607. Change-Id: I9d1501ab0492a24ddbd6877b3cc735dfbc5a6944 Signed-off-by: Joseph Chen --- arch/arm/dts/rk3308-u-boot.dtsi | 5 ----- arch/arm/dts/rk3308.dtsi | 1 - 2 files changed, 6 deletions(-) diff --git a/arch/arm/dts/rk3308-u-boot.dtsi b/arch/arm/dts/rk3308-u-boot.dtsi index fae2d4fb07..4da226322c 100644 --- a/arch/arm/dts/rk3308-u-boot.dtsi +++ b/arch/arm/dts/rk3308-u-boot.dtsi @@ -83,11 +83,6 @@ status = "okay"; }; -&gpio0 { - u-boot,dm-pre-reloc; - status = "disabled"; -}; - &route_rgb { status = "disabled"; }; \ No newline at end of file diff --git a/arch/arm/dts/rk3308.dtsi b/arch/arm/dts/rk3308.dtsi index 2d50ba881e..1e9ec023e6 100644 --- a/arch/arm/dts/rk3308.dtsi +++ b/arch/arm/dts/rk3308.dtsi @@ -392,7 +392,6 @@ <&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 = ; pinctrl-names = "default"; pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_bus4>; -- cgit v1.2.3 From dd9ee2cc6f89aa6ba5de7bad07d981dd3b1d1ccf Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 5 Mar 2019 14:10:44 +0800 Subject: rockchip: rk3368: correct MMU ram map size Change-Id: I4884a88613fe5c2fa515360d4c754f4eade84ed3 Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/rk3368/rk3368.c | 8 ++++---- include/configs/rk3368_common.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/arm/mach-rockchip/rk3368/rk3368.c b/arch/arm/mach-rockchip/rk3368/rk3368.c index e82b631138..0bfe39d5f3 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 diff --git a/include/configs/rk3368_common.h b/include/configs/rk3368_common.h index e7f4178f0c..4f9105edac 100644 --- a/include/configs/rk3368_common.h +++ b/include/configs/rk3368_common.h @@ -15,7 +15,7 @@ #include #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 -- cgit v1.2.3 From e84ef14d6d009949d80b0c2d722d8c736814ef4c Mon Sep 17 00:00:00 2001 From: lifangyuan Date: Wed, 6 Mar 2019 10:59:17 +0800 Subject: configs: rockchip: rk3288: Fdt overlay enabled by default. Change-Id: I61a127b39b5bbb03da3042b776b5d0fff1a20aed Signed-off-by: lifangyuan --- configs/rk3288_defconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configs/rk3288_defconfig b/configs/rk3288_defconfig index 3e80f41644..34c0705cfc 100644 --- a/configs/rk3288_defconfig +++ b/configs/rk3288_defconfig @@ -21,6 +21,7 @@ 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 @@ -105,6 +106,7 @@ 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_AVB_LIBAVB=y CONFIG_AVB_LIBAVB_AB=y -- cgit v1.2.3 From 74b485fb2bb55e7d9926171a44f5be0a36fa6796 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Wed, 23 Jan 2019 16:43:43 +0800 Subject: fastboot: delete write perm-attr hash if use pre-loader pub_key Since we use the pre-loader public key to verify permanent attribute, then we do not need to write permanent attribute hash to otp & efuse. Change-Id: Ic5e19fed2fc9405ab5bc7504dd930fd5f02d847c Signed-off-by: Jason Zhu --- drivers/usb/gadget/f_fastboot.c | 11 ++++++----- lib/avb/libavb_atx/avb_atx_validate.c | 2 +- lib/avb/libavb_user/avb_ops_user.c | 2 +- lib/avb/rk_avb_user/Kconfig | 7 +++++++ 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index b6de1c37f6..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; diff --git a/lib/avb/libavb_atx/avb_atx_validate.c b/lib/avb/libavb_atx/avb_atx_validate.c index c51a2bdd33..9695d1b17a 100644 --- a/lib/avb/libavb_atx/avb_atx_validate.c +++ b/lib/avb/libavb_atx/avb_atx_validate.c @@ -71,7 +71,7 @@ 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 ROCKCHIP_USE_PRE_LOADER_PUB_KEY +#ifdef CONFIG_ROCKCHIP_PRELOADER_PUB_KEY #ifdef CONFIG_CRYPTO_ROCKCHIP struct rk_pub_key pub_key; int i; diff --git a/lib/avb/libavb_user/avb_ops_user.c b/lib/avb/libavb_user/avb_ops_user.c index fca89265ae..9d4db76340 100644 --- a/lib/avb/libavb_user/avb_ops_user.c +++ b/lib/avb/libavb_user/avb_ops_user.c @@ -354,7 +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 ROCKCHIP_USE_PRE_LOADER_PUB_KEY +#ifndef CONFIG_ROCKCHIP_PRELOADER_PUB_KEY #ifdef CONFIG_OPTEE_CLIENT if (trusty_read_attribute_hash((uint32_t *)hash, AVB_SHA256_DIGEST_SIZE / 4)) 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. -- cgit v1.2.3 From f44ca27357563e9ed43f1ff76d3bd8dd14f4747e Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 7 Mar 2019 15:20:30 +0800 Subject: android: fix retry mechanism with ab system Minus the retry-count in every boot with ab system. If the ab system boot success, the system service boot_ctrl reset the retry-count or set boot-successful. Change-Id: Ic37f65b745d1feb978730332835246dc43d72dab Signed-off-by: Jason Zhu --- common/android_bootloader.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/common/android_bootloader.c b/common/android_bootloader.c index 58b3815475..a5f59dc64f 100644 --- a/common/android_bootloader.c +++ b/common/android_bootloader.c @@ -574,17 +574,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"); -- cgit v1.2.3 From 841c4e175528e5ce2886586e22431ff2eb1c1f03 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Mon, 11 Mar 2019 16:24:00 +0800 Subject: rockchip: atags: add tag for SoC information Change-Id: Ic2f89b8deb5cebeaaa05fb6cd67997429821904c Signed-off-by: Joseph Chen --- arch/arm/include/asm/arch-rockchip/rk_atags.h | 15 +++++++++++++++ arch/arm/mach-rockchip/rk_atags.c | 17 +++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/arch/arm/include/asm/arch-rockchip/rk_atags.h b/arch/arm/include/asm/arch-rockchip/rk_atags.h index 20ada99821..b9028b35d2 100644 --- a/arch/arm/include/asm/arch-rockchip/rk_atags.h +++ b/arch/arm/include/asm/arch-rockchip/rk_atags.h @@ -18,6 +18,7 @@ #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 */ @@ -45,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; @@ -126,6 +132,14 @@ struct tag_ram_partition { 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 { u32 flags; u32 pagesize; @@ -149,6 +163,7 @@ struct tag { 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/mach-rockchip/rk_atags.c b/arch/arm/mach-rockchip/rk_atags.c index 90a6e3ff89..be5dfecad7 100644 --- a/arch/arm/mach-rockchip/rk_atags.c +++ b/arch/arm/mach-rockchip/rk_atags.c @@ -199,6 +199,9 @@ int atags_set_tag(u32 magic, void *tagdata) case ATAG_PUB_KEY: size = tag_size(tag_pub_key); break; + case ATAG_SOC_INFO: + size = tag_size(tag_soc_info); + break; }; if (!size) @@ -403,6 +406,17 @@ void atags_print_tag(struct tag *t) 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"); printf(" magic = 0x%x\n", t->hdr.magic); @@ -445,6 +459,7 @@ void atags_test(void) 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)); @@ -453,6 +468,7 @@ void atags_test(void) 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); @@ -484,6 +500,7 @@ void atags_test(void) 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(); -- cgit v1.2.3 From e217fe3cbd101c9a1de6025b4df6ee10ddeb3ed0 Mon Sep 17 00:00:00 2001 From: Keerthy Date: Fri, 21 Dec 2018 21:54:30 +0530 Subject: lib: fdtdec: fdtdec_get_addr_size_fixed remove checks With 8 bytes addressing even on 32 bit machines these checks are no longer valid. Remove them. Signed-off-by: Keerthy Reviewed-by: Simon Glass (cherry picked from commit f51f6715a5013f37620c38f0430e21d4736e235a) Signed-off-by: Andy Yan Change-Id: I07d143dbd4dfeff1ce99d081d1279c4f70fa4e8f --- lib/fdtdec.c | 10 ---------- 1 file changed, 10 deletions(-) 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"); -- cgit v1.2.3 From 28e9b49d47835df7cbf23b10c90cd05a90d56bc1 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Mon, 11 Mar 2019 14:44:52 +0800 Subject: rockchip: board: fdt fixup mmc strength as 2mA for rk1808 Change-Id: I183e671a6a3ea753f163b2c3f534de85f584bd38 Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/board.c | 80 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c index 2244eaffef..702fd51df2 100644 --- a/arch/arm/mach-rockchip/board.c +++ b/arch/arm/mach-rockchip/board.c @@ -282,22 +282,98 @@ int interrupt_debugger_init(void) return ret; } +#ifdef CONFIG_ROCKCHIP_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 CONFIG_ROCKCHIP_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; -- cgit v1.2.3 From 6a3f8006e0a917eb156f0951c3e41ac3ce3f78ef Mon Sep 17 00:00:00 2001 From: William Wu Date: Tue, 12 Mar 2019 19:46:04 +0800 Subject: usb: phy: rockchip: fix implicit definition warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When make with rock_defconfig, compile warning for the following implicitly defined function are raised due to a missing include directive: drivers/usb/phy/rockchip_usb2_phy.c: In function ‘otg_phy_parse’: drivers/usb/phy/rockchip_usb2_phy.c: 102:10: error: implicit declaration of function ‘fdt_translate_address’ [-Werror=implicit-function-declaration] addr = fdt_translate_address(blob, node, reg); ^~~~~~~~~~~~~~~~~~~~~ This change fixes this by including . And this patch also fixes the following compile error: drivers/usb/phy/rockchip_usb2_phy.c:96:1: error: label ‘retry’ defined but not used [-Werror=unused-label] Change-Id: Ia82d0ff02b0f528ddde8a553d457c6c0cb763680 Signed-off-by: William Wu --- drivers/usb/phy/rockchip_usb2_phy.c | 3 +++ 1 file changed, 3 insertions(+) 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 #include #include +#include #include #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) -- cgit v1.2.3 From 41175141f329f7fc754a84dd8829c36b96efb78c Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Thu, 14 Mar 2019 11:32:37 +0800 Subject: mtd: nand: rockchip: fix incompatible-pointer-types compile err MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix the following compile error: drivers/mtd/nand/rockchip_nand.c: In function ‘nand_spl_load_image’: drivers/mtd/nand/rockchip_nand.c:657:39: error: passing argument 3 of ‘nand_read_skip_bad’ from incompatible pointer type [-Werror=incompatible-pointer-types] return nand_read_skip_bad(mtd, offs, &size, NULL, size, (u_char *)dst); ^ In file included from drivers/mtd/nand/rockchip_nand.c:11:0: include/nand.h:101:5: note: expected ‘size_t * {aka long unsigned int *}’ but argument is of type ‘unsigned int *’ int nand_read_skip_bad(struct mtd_info *mtd, loff_t offset, size_t *length, Change-Id: I44c97f21c2c2d40a7dcbdab7ddb96a1025949ee4 Signed-off-by: Andy Yan Signed-off-by: Jason Zhu --- drivers/mtd/nand/rockchip_nand.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/mtd/nand/rockchip_nand.c b/drivers/mtd/nand/rockchip_nand.c index d8f443972a..16463e16a1 100644 --- a/drivers/mtd/nand/rockchip_nand.c +++ b/drivers/mtd/nand/rockchip_nand.c @@ -652,9 +652,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) {} -- cgit v1.2.3 From 7aec704a4e9d9322f1102bcf61ee5c3cf6ec794d Mon Sep 17 00:00:00 2001 From: Yifeng Zhao Date: Tue, 5 Mar 2019 14:59:06 +0800 Subject: drivers: mtd: nand: rockchip nandc add bad block detect api The data layout for rockchip nandc is: 1024 bytes data + 32 obb + 1024 data + 32 obb ... The system detect bad block flag locate at 2048, 4096, 8192... The system checks for bad blocks and gets the wrong bad block. Add a bad block detect api to check the bad block. Change-Id: I8b0f2907a851d3bbb4d1b9f5daf21319bfb047d9 Signed-off-by: Yifeng Zhao --- drivers/mtd/nand/nand_bbt.c | 6 ++++-- drivers/mtd/nand/rockchip_nand.c | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 4 deletions(-) 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 16463e16a1..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; -- cgit v1.2.3 From 957c1cf2afe1fd48f4f054df0088cae080e84ae9 Mon Sep 17 00:00:00 2001 From: Shunqian Zheng Date: Thu, 14 Mar 2019 15:08:22 +0800 Subject: usb: rockusb: Forbid data beyond 32MB reading Simply return magic char if one is trying to read data beyond 32MB. Fixes: 628c827 ("usb: rockusb: forbid reading data beyond addr 32MB") Change-Id: If2cdf05dbf9d6dcdd4cf8f9605ab84480fbca32d Signed-off-by: Shunqian Zheng --- cmd/rockusb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 { -- cgit v1.2.3 From 9d2bc40cc004402b9560beebb491530e6fa60a71 Mon Sep 17 00:00:00 2001 From: Andy Yan Date: Fri, 22 Feb 2019 19:12:12 +0800 Subject: boot_rkimg: don't override BOOT_MODE_REG We should keep the boot mode value, linux kernel need it. Change-Id: Ic31166dffc3fefdf352cac1d1002a91dea319fc5 Signed-off-by: Andy Yan --- common/boot_rkimg.c | 1 - 1 file changed, 1 deletion(-) diff --git a/common/boot_rkimg.c b/common/boot_rkimg.c index 0d48232e3e..dc7f1a06b6 100644 --- a/common/boot_rkimg.c +++ b/common/boot_rkimg.c @@ -389,7 +389,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: -- cgit v1.2.3 From eef7c6f46aae73db57851c4e329a7eeb997de24a Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 14 Mar 2019 19:20:11 +0800 Subject: rockchip: board: ignore mmc strength fdt fixup for rk3399pro-npu Change-Id: Ic2b787e2bff49e73ca3ec3404fc74751d2903aa6 Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/board.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c index 702fd51df2..573956c118 100644 --- a/arch/arm/mach-rockchip/board.c +++ b/arch/arm/mach-rockchip/board.c @@ -282,7 +282,7 @@ int interrupt_debugger_init(void) return ret; } -#ifdef CONFIG_ROCKCHIP_RK1808 +#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" @@ -351,7 +351,7 @@ int board_fdt_fixup(void *blob) if (ret) printf("fdt set compatible failed: %d\n", ret); } -#elif CONFIG_ROCKCHIP_RK1808 +#elif defined(CONFIG_ROCKCHIP_RK1808) && !defined(CONFIG_COPROCESSOR_RK1808) struct tag *t; u32 ph_pu_2ma; -- cgit v1.2.3 From 4df150d1285811ed25f627f47c39716f088fa35a Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Fri, 22 Feb 2019 22:10:29 +0800 Subject: rockchip: dts: rk322x: add cd-gpios Add cd-gpios to test the mmc device whether exit. Change-Id: I171f4c0d895baf1a1b54c971fc88370a0b10ce3a Signed-off-by: Jason Zhu --- arch/arm/dts/rk322x-u-boot.dtsi | 4 ++++ arch/arm/dts/rk322x.dtsi | 1 + 2 files changed, 5 insertions(+) diff --git a/arch/arm/dts/rk322x-u-boot.dtsi b/arch/arm/dts/rk322x-u-boot.dtsi index 432af90b7c..7034b344e1 100644 --- a/arch/arm/dts/rk322x-u-boot.dtsi +++ b/arch/arm/dts/rk322x-u-boot.dtsi @@ -61,3 +61,7 @@ u-boot,dm-pre-reloc; status = "okay"; }; + +&gpio1 { + u-boot,dm-pre-reloc; +}; 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"; -- cgit v1.2.3 From 472ddf73a4b045229b692e803fd5735cf5ea26ae Mon Sep 17 00:00:00 2001 From: Hisping Lin Date: Wed, 23 Jan 2019 09:05:37 +0800 Subject: lib: optee_client: add support for power-off protection Change-Id: I4babcc1989563a3c707a1cac7e93069031f033dd Signed-off-by: Hisping Lin --- lib/optee_clientApi/OpteeClientRkFs-v2.c | 387 ++++++++++++++++++++++++++++- lib/optee_clientApi/OpteeClientRkFs.c | 410 ++++++++++++++++++++++++++++++- 2 files changed, 791 insertions(+), 6 deletions(-) diff --git a/lib/optee_clientApi/OpteeClientRkFs-v2.c b/lib/optee_clientApi/OpteeClientRkFs-v2.c index b1f634997d..542e32d720 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,6 +174,288 @@ static int dir_seek; static struct blk_desc *dev_desc = NULL; static disk_partition_t part_info; +/* + * 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 (!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) { + dev_desc = NULL; + printf("Could not find security partition\n"); + 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 (!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) { + dev_desc = NULL; + printf("Could not find security partition\n"); + 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 (!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) { + dev_desc = NULL; + printf("Could not find security partition\n"); + 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 (!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) { + dev_desc = NULL; + printf("Could not find security partition\n"); + 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; @@ -179,6 +484,13 @@ static int rkss_read_multi_sections(unsigned char *data, unsigned long index, un 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 (dev_desc == NULL) { dev_desc = rockchip_get_bootdev(); @@ -764,6 +1076,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 +1129,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 +1209,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 +1299,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 +1317,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 +1350,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 +1366,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 +1408,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 +1425,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 +1463,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 +1553,12 @@ int tee_supp_rk_fs_init(void) struct rk_secure_storage rkss = {0}; unsigned char *table_data; + 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 +1569,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,6 +1608,13 @@ 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; } diff --git a/lib/optee_clientApi/OpteeClientRkFs.c b/lib/optee_clientApi/OpteeClientRkFs.c index 25a639c5a8..eb9ccfacc5 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,6 +186,288 @@ 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; +/* + * 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 (!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) { + dev_desc = NULL; + printf("Could not find security partition\n"); + 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 (!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) { + dev_desc = NULL; + printf("Could not find security partition\n"); + 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 (!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) { + dev_desc = NULL; + printf("Could not find security partition\n"); + 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 (!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) { + dev_desc = NULL; + printf("Could not find security partition\n"); + 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; @@ -196,6 +501,13 @@ 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; + + result = rkss_backup_sections(index, num); + if (result < 0) { + printf("rkss_backup_sections fail\n"); + return -1; + } if (dev_desc == NULL) { dev_desc = rockchip_get_bootdev(); @@ -549,7 +861,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 +1113,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 +1148,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 +1225,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 +1260,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 +1319,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 +1347,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; } @@ -1029,6 +1378,11 @@ static int tee_fs_link(struct tee_fs_rpc *fsrpc) 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 +1405,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 +1428,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 +1443,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 +1468,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 +1481,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 +1523,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 +1601,13 @@ int tee_supp_rk_fs_init(void) __maybe_unused int i = 0; unsigned char *table_data; + int ret; + + 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 +1619,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,6 +1669,12 @@ 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; } int OpteeClientRkFsInit(void) -- cgit v1.2.3 From b4a0434fc98903ef97eae434c21a6082a6942e5a Mon Sep 17 00:00:00 2001 From: Hisping Lin Date: Fri, 8 Mar 2019 10:14:43 +0800 Subject: lib: optee_client: do not init RK FS if security not exist Change-Id: I91e780448cee7884c7477cb0b5720f962b2df00d Signed-off-by: Hisping Lin --- include/optee_include/OpteeClientRkFs-v2.h | 1 + include/optee_include/OpteeClientRkFs.h | 2 + lib/optee_clientApi/OpteeClientRPC.c | 5 ++ lib/optee_clientApi/OpteeClientRkFs-v2.c | 130 +++++++++-------------------- lib/optee_clientApi/OpteeClientRkFs.c | 130 +++++++++-------------------- 5 files changed, 84 insertions(+), 184 deletions(-) diff --git a/include/optee_include/OpteeClientRkFs-v2.h b/include/optee_include/OpteeClientRkFs-v2.h index fa710adb7e..57138a07dd 100644 --- a/include/optee_include/OpteeClientRkFs-v2.h +++ b/include/optee_include/OpteeClientRkFs-v2.h @@ -71,5 +71,6 @@ int tee_supp_rk_fs_init(void); int tee_supp_rk_fs_process(size_t num_params, struct tee_ioctl_param *params); 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 ed91aa9c11..d70c118c75 100644 --- a/include/optee_include/OpteeClientRkFs.h +++ b/include/optee_include/OpteeClientRkFs.h @@ -35,4 +35,6 @@ int tee_supp_rk_fs_process(void *cmd, uint32_t cmd_size); int OpteeClientRkFsInit(void); +int check_security_exist(int print_flag); + #endif 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 542e32d720..ce826d25d5 100644 --- a/lib/optee_clientApi/OpteeClientRkFs-v2.c +++ b/lib/optee_clientApi/OpteeClientRkFs-v2.c @@ -174,6 +174,27 @@ static int dir_seek; static struct blk_desc *dev_desc = NULL; static disk_partition_t part_info; + +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) { + dev_desc = NULL; + if (print_flag != 0) + printf("Could not find security partition\n"); + return -1; + } + } + return 0; +} + /* * action1: * rkss_begin_commit set enable flag @@ -197,20 +218,8 @@ static int rkss_begin_commit(void) struct rkss_backup_verification p; unsigned long ret; - 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) { - dev_desc = NULL; - printf("Could not find security partition\n"); - return -1; - } - } + if (check_security_exist(1) < 0) + return -1; debug("%s\n", __func__); p.backup_version = RKSS_BACKUP_VERSION; @@ -233,20 +242,8 @@ static int rkss_finish_commit(void) unsigned char data[RKSS_DATA_LEN]; unsigned long ret; - 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) { - dev_desc = NULL; - printf("Could not find security partition\n"); - return -1; - } - } + if (check_security_exist(1) < 0) + return -1; debug("%s\n", __func__); memset(data, 0, sizeof(data)); @@ -267,20 +264,8 @@ static int rkss_backup_sections(unsigned long index, unsigned int num) struct rkss_backup_info info_last, info_current; unsigned long ret; - 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) { - dev_desc = NULL; - printf("Could not find security partition\n"); - return -1; - } - } + if (check_security_exist(1) < 0) + return -1; ret = blk_dread(dev_desc, RKSS_BACKUP_INDEX, 1, data); if (ret != 1) { @@ -366,20 +351,8 @@ static int rkss_resume(void) unsigned int i; unsigned long ret; - 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) { - dev_desc = NULL; - printf("Could not find security partition\n"); - return -1; - } - } + if (check_security_exist(1) < 0) + return -1; ret = blk_dread(dev_desc, RKSS_BACKUP_INDEX, 1, data); if (ret != 1) { @@ -460,19 +433,9 @@ static int rkss_read_multi_sections(unsigned char *data, unsigned long index, un { 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 + index, num, data); if (ret != num) { printf("blk_dread fail\n"); @@ -492,19 +455,9 @@ static int rkss_write_multi_sections(unsigned char *data, unsigned long index, u return -1; } - 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_dwrite(dev_desc, part_info.start + index, num, data); if (ret != num) { printf("blk_dwrite fail\n"); @@ -517,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"); @@ -1553,6 +1496,9 @@ 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!"); diff --git a/lib/optee_clientApi/OpteeClientRkFs.c b/lib/optee_clientApi/OpteeClientRkFs.c index eb9ccfacc5..53a2ebcaca 100644 --- a/lib/optee_clientApi/OpteeClientRkFs.c +++ b/lib/optee_clientApi/OpteeClientRkFs.c @@ -186,6 +186,27 @@ 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; + +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) { + dev_desc = NULL; + if (print_flag != 0) + printf("Could not find security partition\n"); + return -1; + } + } + return 0; +} + /* * action1: * rkss_begin_commit set enable flag @@ -209,20 +230,8 @@ static int rkss_begin_commit(void) struct rkss_backup_verification p; unsigned long ret; - 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) { - dev_desc = NULL; - printf("Could not find security partition\n"); - return -1; - } - } + if (check_security_exist(1) < 0) + return -1; debug("%s\n", __func__); p.backup_version = RKSS_BACKUP_VERSION; @@ -245,20 +254,8 @@ static int rkss_finish_commit(void) unsigned char data[RKSS_DATA_LEN]; unsigned long ret; - 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) { - dev_desc = NULL; - printf("Could not find security partition\n"); - return -1; - } - } + if (check_security_exist(1) < 0) + return -1; debug("%s\n", __func__); memset(data, 0, sizeof(data)); @@ -279,20 +276,8 @@ static int rkss_backup_sections(unsigned long index, unsigned int num) struct rkss_backup_info info_last, info_current; unsigned long ret; - 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) { - dev_desc = NULL; - printf("Could not find security partition\n"); - return -1; - } - } + if (check_security_exist(1) < 0) + return -1; ret = blk_dread(dev_desc, RKSS_BACKUP_INDEX, 1, data); if (ret != 1) { @@ -378,20 +363,8 @@ static int rkss_resume(void) unsigned int i; unsigned long ret; - 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) { - dev_desc = NULL; - printf("Could not find security partition\n"); - return -1; - } - } + if (check_security_exist(1) < 0) + return -1; ret = blk_dread(dev_desc, RKSS_BACKUP_INDEX, 1, data); if (ret != 1) { @@ -472,19 +445,9 @@ static int rkss_read_multi_sections(unsigned char *data, unsigned long index, un { 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 + index, num, data); if (ret != num) { printf("blk_dread fail\n"); @@ -509,19 +472,9 @@ static int rkss_write_multi_sections(unsigned char *data, unsigned long index, u return -1; } - 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_dwrite(dev_desc, part_info.start + index, num, data); if (ret != num) { printf("blk_dwrite fail\n"); @@ -539,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"); @@ -1603,6 +1546,9 @@ int tee_supp_rk_fs_init(void) unsigned char *table_data; int ret; + if (check_security_exist(0) < 0) + return 0; + ret = rkss_resume(); if (ret < 0) { printf("rkss_resume failed!"); -- cgit v1.2.3 From b60f8c855632938690460919ee118478a37a43b3 Mon Sep 17 00:00:00 2001 From: Ziyuan Xu Date: Fri, 15 Mar 2019 14:13:15 +0800 Subject: configs: px30: enable lzo/lz4 Change-Id: Ie914d9181e2ab06f92060b359cb65f6139f946db Signed-off-by: Ziyuan Xu --- configs/evb-px30_defconfig | 2 ++ configs/px30_defconfig | 2 ++ 2 files changed, 4 insertions(+) diff --git a/configs/evb-px30_defconfig b/configs/evb-px30_defconfig index 537eb862a0..98260f19b0 100644 --- a/configs/evb-px30_defconfig +++ b/configs/evb-px30_defconfig @@ -127,6 +127,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/px30_defconfig b/configs/px30_defconfig index fa6f3ca739..d28f6778ae 100644 --- a/configs/px30_defconfig +++ b/configs/px30_defconfig @@ -129,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_OF_LIBFDT_OVERLAY=y # CONFIG_EFI_LOADER is not set -- cgit v1.2.3 From 6787bf9f0a0a3972da5287523cfe6bf7f1e2e007 Mon Sep 17 00:00:00 2001 From: Ziyuan Xu Date: Fri, 15 Mar 2019 15:32:16 +0800 Subject: configs: rk3326: enable lzo/lz4 Change-Id: I7184cd7020a0bbe18dfa91d5a0cfba2e44ccc40c Signed-off-by: Ziyuan Xu --- configs/rk3326_defconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configs/rk3326_defconfig b/configs/rk3326_defconfig index b4e4487fff..698f4e50a5 100644 --- a/configs/rk3326_defconfig +++ b/configs/rk3326_defconfig @@ -121,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 -- cgit v1.2.3 From 2e68f6b5f95dc7b49d193cb54ca8737d034d6d43 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 5 Mar 2019 09:57:47 +0800 Subject: power: charge animation: support long key event without release Change-Id: I9d7cd439376f2f4ff89ea6bfe3baedbeaa4deeb9 Signed-off-by: Joseph Chen --- drivers/power/charge_animation.c | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) 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", -- cgit v1.2.3 From f3124cd74429849948d85130dff43f77d0f4196f Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Tue, 5 Mar 2019 15:07:51 +0800 Subject: spl: fit: use ddr for mmc read buffer in SPL for rk3368 rk3368 has the same problem with rk3399. Change-Id: I242385722f864810273708f03dc62359a7bdb81e Signed-off-by: Jason Zhu --- common/spl/spl_fit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 -- cgit v1.2.3 From 590d13d737ce5c2d233367368a2904f40053be91 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 8 Mar 2019 17:11:23 +0800 Subject: console: add CONFIG_CONSOLE_DISABLE_CTRLC to disable ctrlc There are sometimes we would like to disable ctrlc, just enable it. Change-Id: I2911650b22d47b057a039774d8293cad6317bb6d Signed-off-by: Joseph Chen --- common/Kconfig | 5 +++++ common/console.c | 12 ++---------- 2 files changed, 7 insertions(+), 10 deletions(-) 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/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 -- cgit v1.2.3 From ee561e345b97338e95a34699274e51caeed75acf Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 8 Mar 2019 17:12:53 +0800 Subject: lib: avb: AVB_VBMETA_PUBLIC_KEY_VALIDATE select CONSOLE_DISABLE_CTRLC Clean coding style by the way. Change-Id: Ib614175e9ea7ceebc49030235b66d82adc57d3a0 Signed-off-by: Joseph Chen --- lib/avb/libavb_user/Kconfig | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) 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" -- cgit v1.2.3 From 6e9d994efbb82d7deee1f42f190a6c49439c4ace Mon Sep 17 00:00:00 2001 From: Jon Lin Date: Tue, 19 Mar 2019 21:59:37 +0800 Subject: rkflash: support 8KB page size slc flash comfirm in MT29F16G08ABABA Change-Id: Ib2a3c62b3a4c9b9880c78fb01d39d4ad8fe2ac87 Signed-off-by: Jon Lin --- drivers/rkflash/flash.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/rkflash/flash.c b/drivers/rkflash/flash.c index c42e6d887f..835efe7f51 100644 --- a/drivers/rkflash/flash.c +++ b/drivers/rkflash/flash.c @@ -525,7 +525,8 @@ 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; } @@ -542,13 +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 = 1024;; + 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); -- cgit v1.2.3 From a0f7ba0595aae57a2ab9266cecc69952e57739f1 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 21 Mar 2019 10:24:47 +0800 Subject: common: fdt support: delete env "initrd=" Fix AB sysmem miss delete env "initrd=". Change-Id: I77ab135644d3b1d2a2eb3f3be6168cf6ef4417df Signed-off-by: Joseph Chen --- common/fdt_support.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 } -- cgit v1.2.3 From 4cd861d04babddfd85cfe4f082aa568ff97f38e7 Mon Sep 17 00:00:00 2001 From: Zhihuan He Date: Wed, 6 Mar 2019 14:28:59 +0800 Subject: arm64: dts: rockchip: rv1108: add u-boot,dm-pre-reloc The uart, dmc and grf device add "u-boot,dm-pre-reloc". Before relocated, u-boot will analyse dram capacity which is need the device of "u-boot,dm-pre-reloc" attribute. Change-Id: I1d18b564b0c521b176a2293a03403139034ccc0b Signed-off-by: Zhihuan He --- arch/arm/dts/rv1108-evb.dts | 2 +- arch/arm/dts/rv1108-u-boot.dtsi | 27 +++++++++++++++++++++++++++ arch/arm/dts/rv1108.dtsi | 1 - configs/evb-rv1108_defconfig | 1 + 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 arch/arm/dts/rv1108-u-boot.dtsi 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 @@ -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/configs/evb-rv1108_defconfig b/configs/evb-rv1108_defconfig index 8b3c477645..dc77050846 100644 --- a/configs/evb-rv1108_defconfig +++ b/configs/evb-rv1108_defconfig @@ -2,6 +2,7 @@ CONFIG_ARM=y # CONFIG_SPL_USE_ARCH_MEMCPY is not set # CONFIG_SPL_USE_ARCH_MEMSET is not set CONFIG_ARCH_ROCKCHIP=y +CONFIG_SYS_MALLOC_F_LEN=0x2000 CONFIG_ROCKCHIP_RV1108=y CONFIG_SPL_ROCKCHIP_BACK_TO_BROM=y CONFIG_RKIMG_BOOTLOADER=y -- cgit v1.2.3 From e5f393836beb9bad70af6cfe5d1549c9d1e4f74f Mon Sep 17 00:00:00 2001 From: Zhihuan He Date: Wed, 6 Mar 2019 14:38:42 +0800 Subject: driver: ram: rv1108: use common code to setup ddr parameter use rockchip_setup_ddr_param to setup ddr parameter. The dram_init() and dram_init_banksize() make use of sdram common code. Change-Id: Icfc6cbef9fcc128e3a835184b46b89b9b22aab16 Signed-off-by: Zhihuan He --- arch/arm/mach-rockchip/rv1108/rv1108.c | 21 --------------------- configs/evb-rv1108_defconfig | 6 +++++- drivers/ram/rockchip/Makefile | 1 + drivers/ram/rockchip/rockchip_sdram.c | 13 +++++++++++-- drivers/ram/rockchip/sdram_rv1108.c | 15 +++++++++++++++ include/configs/rv1108_common.h | 2 +- 6 files changed, 33 insertions(+), 25 deletions(-) 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/configs/evb-rv1108_defconfig b/configs/evb-rv1108_defconfig index dc77050846..c605c33a13 100644 --- a/configs/evb-rv1108_defconfig +++ b/configs/evb-rv1108_defconfig @@ -2,6 +2,8 @@ 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 @@ -16,6 +18,7 @@ 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 @@ -35,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/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 #include #include +#include #include #include #include @@ -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_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/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 -- cgit v1.2.3 From a78c73bb661fb82d665f69745fc5b80d5c32b57f Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 14 Mar 2019 18:20:51 +0800 Subject: include: lmb: increase MAX_LMB_REGIONS to 16 Maybe 8 is not enough. Change-Id: Idc4813fa406def5401fdf423cdf30d47555d1a92 Signed-off-by: Joseph Chen --- include/lmb.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; -- cgit v1.2.3 From e95ee152a4ba4e58e479600ba3c2d430af164a33 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 14 Mar 2019 18:29:13 +0800 Subject: common: image-fdt: only care about enabled reserved-memory Change-Id: I2c17cb1a8237e709cf8a528b35be2dcea70d4627 Signed-off-by: Joseph Chen --- common/image-fdt.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/common/image-fdt.c b/common/image-fdt.c index 6bdbe6c902..c903d51443 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,6 +142,7 @@ int boot_fdt_add_sysmem_rsv_regions(void *fdt_blob) fdt_addr_t rsv_addr; static int rsv_done; char resvname[32]; + const void *prop; int ret; if (fdt_check_header(fdt_blob) != 0 || rsv_done) @@ -163,6 +169,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); -- cgit v1.2.3 From a7774f5911624928ed1d9cfed5453aab206c512e Mon Sep 17 00:00:00 2001 From: Zhangbin Tong Date: Thu, 6 Sep 2018 17:35:16 +0800 Subject: common: boot_rkimg: set "androidboot.mode=" as "normal" or "charger" - The legacy setting rule is deprecated(Android SDK < 8.1). - Provide CONFIG_RKIMG_ANDROID_BOOTMODE_LEGACY to enable legacy setting. Change-Id: I5c8b442b02df068a0ab98ccc81a4f008ebe540c1 Signed-off-by: Zhangbin Tong Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/Kconfig | 8 ++++++++ common/boot_rkimg.c | 28 ++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig index 11402c8b42..36ec749a04 100644 --- a/arch/arm/mach-rockchip/Kconfig +++ b/arch/arm/mach-rockchip/Kconfig @@ -537,6 +537,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 diff --git a/common/boot_rkimg.c b/common/boot_rkimg.c index dc7f1a06b6..ca8c2a42d3 100644 --- a/common/boot_rkimg.c +++ b/common/boot_rkimg.c @@ -208,10 +208,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 +233,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); } -- cgit v1.2.3 From 88bfa9796376b6f53662a19d128931208d68d4cd Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 14 Mar 2019 18:22:19 +0800 Subject: include: add memblk.h Provide generic id and struct for memory blocks. Change-Id: I1fe00dfdb8ee8209eca55c8e7ebbedcafa0371a1 Signed-off-by: Joseph Chen --- include/memblk.h | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 include/memblk.h 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 */ -- cgit v1.2.3 From 6e15146effedeaad2a6687afcbf83d1907a0b996 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 14 Mar 2019 18:23:56 +0800 Subject: lib: sysmem: refactor code - import memblk id to manage memory blocks; - change "sysmem_property" to generic "memblock"; - use alloc instead of reserve for all memory blocks; - clean up and fix some logic; - add U-Boot cmd for sysmem; Change-Id: I614223ce3bf97a7b3566412a9d1864fb30b68fd8 Signed-off-by: Joseph Chen --- arch/arm/include/asm/arch-rockchip/param.h | 14 +- arch/arm/mach-rockchip/Makefile | 1 + arch/arm/mach-rockchip/board.c | 28 -- arch/arm/mach-rockchip/memblk.c | 66 ++++ arch/arm/mach-rockchip/param.c | 67 ++-- arch/arm/mach-rockchip/resource_img.c | 2 +- arch/arm/mach-rockchip/sdram_common.c | 3 +- cmd/fastboot.c | 2 +- common/android_bootloader.c | 4 +- common/boot_rkimg.c | 19 +- common/image-android.c | 8 +- common/image-fdt.c | 13 +- include/boot_rkimg.h | 3 + include/image.h | 2 + include/sysmem.h | 120 +++---- lib/sysmem.c | 501 +++++++++++++++-------------- 16 files changed, 452 insertions(+), 401 deletions(-) create mode 100644 arch/arm/mach-rockchip/memblk.c diff --git a/arch/arm/include/asm/arch-rockchip/param.h b/arch/arm/include/asm/arch-rockchip/param.h index 66ba2ac22e..5cd8538e1b 100644 --- a/arch/arm/include/asm/arch-rockchip/param.h +++ b/arch/arm/include/asm/arch-rockchip/param.h @@ -7,28 +7,28 @@ #ifndef __ROCKCHIP_PARAM_H_ #define __ROCKCHIP_PARAM_H_ -#include +#include /** * 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/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 573956c118..fe18ace42c 100644 --- a/arch/arm/mach-rockchip/board.c +++ b/arch/arm/mach-rockchip/board.c @@ -442,34 +442,6 @@ void board_lmb_reserve(struct lmb *lmb) } #endif -#ifdef CONFIG_SYSMEM -int board_sysmem_reserve(struct sysmem *sysmem) -{ - struct sysmem_property prop; - int ret; - - /* ATF */ - prop = param_parse_atf_mem(); - ret = sysmem_reserve(prop.name, prop.base, prop.size); - if (ret) - return ret; - - /* PSTORE/ATAGS/SHM */ - prop = param_parse_common_resv_mem(); - ret = sysmem_reserve(prop.name, prop.base, prop.size); - if (ret) - return ret; - - /* OP-TEE */ - prop = param_parse_optee_mem(); - ret = sysmem_reserve(prop.name, prop.base, prop.size); - if (ret) - return ret; - - return 0; -} -#endif - #if defined(CONFIG_ROCKCHIP_PRELOADER_SERIAL) && \ defined(CONFIG_ROCKCHIP_PRELOADER_ATAGS) int board_init_f_init_serial(void) 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 +#include + +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..3e1bdca38e 100644 --- a/arch/arm/mach-rockchip/param.c +++ b/arch/arm/mach-rockchip/param.c @@ -4,6 +4,8 @@ */ #include +#include +#include #include #include #include @@ -47,13 +49,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 +67,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 +113,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 +127,27 @@ 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; + mem.base = SDRAM_OFFSET(SZ_1M); + mem.size = SZ_1M; - return prop; + return mem; } int param_parse_bootdev(char **devtype, char **devnum) diff --git a/arch/arm/mach-rockchip/resource_img.c b/arch/arm/mach-rockchip/resource_img.c index fced26ff81..d2742fbad7 100755 --- a/arch/arm/mach-rockchip/resource_img.c +++ b/arch/arm/mach-rockchip/resource_img.c @@ -664,7 +664,7 @@ 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; diff --git a/arch/arm/mach-rockchip/sdram_common.c b/arch/arm/mach-rockchip/sdram_common.c index b0e1e4cf6e..1ed20cbbfe 100644 --- a/arch/arm/mach-rockchip/sdram_common.c +++ b/arch/arm/mach-rockchip/sdram_common.c @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -23,7 +24,7 @@ DECLARE_GLOBAL_DATA_PTR; #define NOT_INITIAL -1 static int __dram_init_banksize(int resv_tee) { - struct sysmem_property prop; + struct memblock 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]; diff --git a/cmd/fastboot.c b/cmd/fastboot.c index bb2f416b78..c9ef71da45 100644 --- a/cmd/fastboot.c +++ b/cmd/fastboot.c @@ -65,7 +65,7 @@ static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) goto exit; } - if (!sysmem_alloc_base("fastboot", + if (!sysmem_alloc_base(MEMBLK_ID_FASTBOOT, CONFIG_FASTBOOT_BUF_ADDR, CONFIG_FASTBOOT_BUF_SIZE)) { printf("The fastboot memory space is unusable!\n"); diff --git a/common/android_bootloader.c b/common/android_bootloader.c index a5f59dc64f..2b0a5864e4 100644 --- a/common/android_bootloader.c +++ b/common/android_bootloader.c @@ -332,8 +332,6 @@ int android_bootloader_boot_kernel(unsigned long kernel_address) printf("Booting kernel at %s with fdt at %s...\n\n\n", kernel_addr_r, fdt_addr); - sysmem_dump_check(); - do_bootm(NULL, 0, 4, bootm_args); return -1; @@ -813,7 +811,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; diff --git a/common/boot_rkimg.c b/common/boot_rkimg.c index ca8c2a42d3..9c2aedf03d 100644 --- a/common/boot_rkimg.c +++ b/common/boot_rkimg.c @@ -88,12 +88,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 +99,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 +123,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; } @@ -524,7 +516,6 @@ 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 defined(CONFIG_ARM64) char cmdbuf[64]; diff --git a/common/image-android.c b/common/image-android.c index f37123efaa..64374b10e4 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)) @@ -456,7 +456,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 c903d51443..6cabd2eeff 100644 --- a/common/image-fdt.c +++ b/common/image-fdt.c @@ -143,7 +143,6 @@ int boot_fdt_add_sysmem_rsv_regions(void *fdt_blob) static int rsv_done; char resvname[32]; const void *prop; - int ret; if (fdt_check_header(fdt_blob) != 0 || rsv_done) return -EINVAL; @@ -157,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"); @@ -181,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/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/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/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 - -#define MAX_SYSMEM_REGIONS 64 - -#undef MAX_LMB_REGIONS -#define MAX_LMB_REGIONS MAX_SYSMEM_REGIONS +#include /* * 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,22 +102,10 @@ 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 * @@ -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/sysmem.c b/lib/sysmem.c index 2549de95f2..b050177af1 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 ? " " : ""); + 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,159 @@ 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; + bool req_overlap = false; 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) { + req_overlap = true; + if (base >= gd->ram_top) + return (void *)base; + } + name = sysmem_alias2name(mem_name, (int *)&id); + attr = mem_attr[id]; + } 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)) { 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 +278,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 +450,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 +496,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", + "" +); -- cgit v1.2.3 From 505b141795f509aa8d2eb4073560aff41f91a5bc Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 14 Mar 2019 18:35:21 +0800 Subject: common: board_r: add board_initr_caches_fixup() Remove dram_initr_banksize(), use mmu_set_region_dcache_behaviour() in board_initr_caches_fixup() to set region MMU table attr is more easily. Change-Id: I9d9917e938fe5bbab5aa27575a5c8592ff08ab50 Signed-off-by: Joseph Chen --- common/board_r.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/board_r.c b/common/board_r.c index f8db94c9af..5d550f0446 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -711,7 +711,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,7 +760,7 @@ 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, -- cgit v1.2.3 From e3fbd280efbf98ad3f90e9bfcaf63c5453ccb2df Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 14 Mar 2019 19:35:41 +0800 Subject: rockchip: board: implement board_initr_caches_fixup() Remove dram_initr_banksize(). Change-Id: Ie0da0b8ef43d90c52b3ab2a93d1ad13b4928e70a Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/board.c | 39 +++++++++++++++++++++++++++++++++++ arch/arm/mach-rockchip/sdram_common.c | 5 ----- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c index fe18ace42c..2a79de49ee 100644 --- a/arch/arm/mach-rockchip/board.c +++ b/arch/arm/mach-rockchip/board.c @@ -379,6 +379,45 @@ int board_fdt_fixup(void *blob) 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 diff --git a/arch/arm/mach-rockchip/sdram_common.c b/arch/arm/mach-rockchip/sdram_common.c index 1ed20cbbfe..cb4e46a9d3 100644 --- a/arch/arm/mach-rockchip/sdram_common.c +++ b/arch/arm/mach-rockchip/sdram_common.c @@ -190,11 +190,6 @@ 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) -- cgit v1.2.3 From 483d0493217503c55708e8f9261c25d700fb87cb Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 14 Mar 2019 18:34:30 +0800 Subject: lib: introduce bidram for GD board bi_dram[] memory management Some platform provides more than one dram banks and reserved firmware regions (eg. ATF, OP-TEE, etc) by pre-loader dynamically. It means there are memory holes in board dram layout. What's more, U-Boot will reserved regions at the late bootflow(eg. firmware reserved for AMP). So we introduce bidram mechanism to manage GD board bi_dram[], which provides a way to easily manage memory holes and update bi_dram[]. It dpends on LMB which provides a good algorithm to manage memory blocks. What's different from sysmem? - bidram manage and pass the avaliable memory blocks to kernel; - sysmem is only for U-Boot memory management to avoid ram overlap, it doesn't matter about kernel avaliable memory. Change-Id: I697cbb80bdc961e4ad5ab94548e2dc93feefde6f Signed-off-by: Joseph Chen --- include/bidram.h | 81 +++++++++++ lib/Kconfig | 6 + lib/Makefile | 1 + lib/bidram.c | 428 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 516 insertions(+) create mode 100644 include/bidram.h create mode 100644 lib/bidram.c 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 + +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/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/bidram.c b/lib/bidram.c new file mode 100644 index 0000000000..d39f5b14ae --- /dev/null +++ b/lib/bidram.c @@ -0,0 +1,428 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd + */ + +#include +#include +#include +#include +#include +#include + +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; + } + + /* 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("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)); + } + } + + 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", + "" +); -- cgit v1.2.3 From b9bc76b4e104a91a212ea42d451dc52d237b5629 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Mon, 18 Mar 2019 10:15:01 +0800 Subject: rockchip: param: add ddr memory region parse Change-Id: I7d59ee54a82da57b62970f4bc47faded60ba6ac8 Signed-off-by: Joseph Chen --- arch/arm/include/asm/arch-rockchip/param.h | 8 ++++ arch/arm/mach-rockchip/param.c | 66 ++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/arch/arm/include/asm/arch-rockchip/param.h b/arch/arm/include/asm/arch-rockchip/param.h index 5cd8538e1b..dbfb1fb27f 100644 --- a/arch/arm/include/asm/arch-rockchip/param.h +++ b/arch/arm/include/asm/arch-rockchip/param.h @@ -9,6 +9,14 @@ #include +/** + * 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 * diff --git a/arch/arm/mach-rockchip/param.c b/arch/arm/mach-rockchip/param.c index 3e1bdca38e..8f88958192 100644 --- a/arch/arm/mach-rockchip/param.c +++ b/arch/arm/mach-rockchip/param.c @@ -195,3 +195,69 @@ int param_parse_bootdev(char **devtype, char **devnum) return -ENOSYS; } + +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; +} -- cgit v1.2.3 From 86f870d669efdb2002f01fb2c511e0dd646bf43e Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 14 Mar 2019 19:57:18 +0800 Subject: rockchip: board: import bidram for GD board bi_dram[] Change-Id: I9183f3664aa770bb5139cf635136834a206b75f5 Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/board.c | 35 ++++++ arch/arm/mach-rockchip/sdram_common.c | 223 ++-------------------------------- 2 files changed, 45 insertions(+), 213 deletions(-) diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c index 2a79de49ee..16136442df 100644 --- a/arch/arm/mach-rockchip/board.c +++ b/arch/arm/mach-rockchip/board.c @@ -5,8 +5,10 @@ */ #include #include +#include #include #include +#include #include #include #include @@ -481,6 +483,39 @@ void board_lmb_reserve(struct lmb *lmb) } #endif +#ifdef CONFIG_BIDRAM +int board_bidram_reserve(struct bidram *bidram) +{ + struct memblock mem; + int ret; + + /* ATF */ + mem = param_parse_atf_mem(); + ret = bidram_reserve(MEMBLK_ID_ATF, mem.base, mem.size); + if (ret) + return ret; + + /* PSTORE/ATAGS/SHM */ + mem = param_parse_common_resv_mem(); + ret = bidram_reserve(MEMBLK_ID_SHM, mem.base, mem.size); + if (ret) + return ret; + + /* OP-TEE */ + 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) && \ defined(CONFIG_ROCKCHIP_PRELOADER_ATAGS) int board_init_f_init_serial(void) diff --git a/arch/arm/mach-rockchip/sdram_common.c b/arch/arm/mach-rockchip/sdram_common.c index cb4e46a9d3..f71aacc9cd 100644 --- a/arch/arm/mach-rockchip/sdram_common.c +++ b/arch/arm/mach-rockchip/sdram_common.c @@ -5,7 +5,7 @@ */ #include -#include +#include #include #include #include @@ -18,180 +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 memblock 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)); -} -#endif - size_t rockchip_sdram_size(phys_addr_t reg) { u32 rank, cs0_col, bk, cs0_row, cs1_row, bw, row_3_4; @@ -343,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; } -- cgit v1.2.3 From 309d75e75589415a91feba58ea385e1ec28759b9 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 15 Mar 2019 10:11:45 +0800 Subject: command: board_f/r: add sysmem and bidram During board_f sequence, it's able to add any count of dram banks and validate memory layout after reserve_xxx() done, stop bootflow if there is something wrong. During board_r sequence, it's able to manage all memory blocks and add reserve memory blocks for bi_dram[] at late bootflow, it's nesscessary for AMP boot. Change-Id: I4443a809792bb04e205bb26d79870c85cb5fe7bd Signed-off-by: Joseph Chen --- common/board_f.c | 4 ++++ common/board_r.c | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) 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 #include #include +#include /* * 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 5d550f0446..e49e30c8c2 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -56,6 +56,7 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; @@ -767,8 +768,11 @@ static init_fnc_t init_sequence_r[] = { #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 */ -- cgit v1.2.3 From da051cc8bbb62b506d838dcb8ceb0a7837be305e Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 8 Mar 2019 17:21:24 +0800 Subject: rockchip: add ctrl+f hotkey to enter fastboot mode Change-Id: I1f0a98793307b5a261958fe8c29da3271f2d8e4e Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/boot_mode.c | 2 ++ common/boot_rkimg.c | 11 ++++++++--- include/console.h | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) 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/common/boot_rkimg.c b/common/boot_rkimg.c index 9c2aedf03d..66a5dfebda 100644 --- a/common/boot_rkimg.c +++ b/common/boot_rkimg.c @@ -364,9 +364,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) diff --git a/include/console.h b/include/console.h index d72c8cdf35..c5eac9cba2 100644 --- a/include/console.h +++ b/include/console.h @@ -12,6 +12,7 @@ extern char console_buffer[]; #define CONSOLE_EVT_CTRL_B 0x02 #define CONSOLE_EVT_CTRL_D 0x04 +#define CONSOLE_EVT_CTRL_F 0x06 /* common/console.c */ int console_init_f(void); /* Before relocation; uses the serial stuff */ -- cgit v1.2.3 From 32c868cf114c57c821622037ec28147285f3663e Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 15 Mar 2019 10:45:02 +0800 Subject: common: android: add hotkey for sysmem and bidram dump Change-Id: Ic866dcc2b160ebd92d518e517e0bc8870aec84d0 Signed-off-by: Joseph Chen --- common/android_bootloader.c | 9 +++++++++ include/console.h | 1 + 2 files changed, 10 insertions(+) diff --git a/common/android_bootloader.c b/common/android_bootloader.c index 2b0a5864e4..2a652e47f5 100644 --- a/common/android_bootloader.c +++ b/common/android_bootloader.c @@ -22,8 +22,12 @@ #include #include #include +#include +#include #include +DECLARE_GLOBAL_DATA_PTR; + #define ANDROID_PARTITION_BOOT "boot" #define ANDROID_PARTITION_MISC "misc" #define ANDROID_PARTITION_OEM "oem" @@ -332,6 +336,11 @@ int android_bootloader_boot_kernel(unsigned long kernel_address) printf("Booting kernel at %s with fdt at %s...\n\n\n", kernel_addr_r, fdt_addr); + if (gd->console_evt == CONSOLE_EVT_CTRL_M) { + bidram_dump(); + sysmem_dump(); + } + do_bootm(NULL, 0, 4, bootm_args); return -1; diff --git a/include/console.h b/include/console.h index c5eac9cba2..3af98a622a 100644 --- a/include/console.h +++ b/include/console.h @@ -13,6 +13,7 @@ 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 */ -- cgit v1.2.3 From 2a14a50bdef4de7604536b8ecdb9183642e131f6 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 15 Mar 2019 10:45:22 +0800 Subject: common: rkimg: add hotkey for sysmem and bidram dump Change-Id: I32ded101c764df18f66916dd863145ace81d35be Signed-off-by: Joseph Chen --- common/boot_rkimg.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/common/boot_rkimg.c b/common/boot_rkimg.c index 66a5dfebda..49bc241f69 100644 --- a/common/boot_rkimg.c +++ b/common/boot_rkimg.c @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #define TAG_KERNEL 0x4C4E524B @@ -522,6 +524,11 @@ int boot_rockchip_image(struct blk_desc *dev_desc, disk_partition_t *boot_part) fdt_ramdisk_skip_relocation(); + if (gd->console_evt == CONSOLE_EVT_CTRL_M) { + bidram_dump(); + sysmem_dump(); + } + #if defined(CONFIG_ARM64) char cmdbuf[64]; sprintf(cmdbuf, "booti 0x%lx 0x%lx:0x%x 0x%lx", -- cgit v1.2.3 From 892d0a7f9b16098a22ef0115c3850247a28fb638 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 15 Mar 2019 10:25:57 +0800 Subject: common: android: remove unnesscessary message Change-Id: Iaa5da7da492f3fcb8021d175bb9a39a04d7f61d0 Signed-off-by: Joseph Chen --- common/android_bootloader.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/common/android_bootloader.c b/common/android_bootloader.c index 2a652e47f5..68535abbc8 100644 --- a/common/android_bootloader.c +++ b/common/android_bootloader.c @@ -799,10 +799,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) { -- cgit v1.2.3 From 903381d2b2db2b884dacd54e52c6002a275f1e13 Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Tue, 29 Jan 2019 11:50:47 +0800 Subject: make.sh: support PX5 Update rule to support PX5 Change-Id: I67660165d78eb388e047fbf2189e493265dd45ad Signed-off-by: Kever Yang --- make.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/make.sh b/make.sh index fd9780c237..023e539dfa 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 -- cgit v1.2.3 From 33baa40f0f5304845e01ec5f69ba2293a5e15d4d Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Tue, 29 Jan 2019 11:51:40 +0800 Subject: rockchip: rk3368: support UART4 in board_debug_uart_init() PX5 evb is using UART4 Change-Id: I16ae5c7037123ef1c9d1c793e11d48081214b433 Signed-off-by: Kever Yang --- arch/arm/mach-rockchip/rk3368/rk3368.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/arch/arm/mach-rockchip/rk3368/rk3368.c b/arch/arm/mach-rockchip/rk3368/rk3368.c index 0bfe39d5f3..5fe2f3f19f 100644 --- a/arch/arm/mach-rockchip/rk3368/rk3368.c +++ b/arch/arm/mach-rockchip/rk3368/rk3368.c @@ -254,6 +254,25 @@ 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, -- cgit v1.2.3 From f67455c9588975a81fabdb8cb13be0a4a9bfaf9e Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Tue, 29 Jan 2019 11:53:09 +0800 Subject: rockchip: add CONFIG_ROCKCHIP_PX5 soc type variant Add variant for evb-px5 Change-Id: Id7bfa9719f3283f2dccc674b7e194c16d7ac7f65 Signed-off-by: Kever Yang --- arch/arm/mach-rockchip/Kconfig | 6 ++++++ configs/evb-px5_defconfig | 1 + 2 files changed, 7 insertions(+) diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig index 36ec749a04..880171f022 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" diff --git a/configs/evb-px5_defconfig b/configs/evb-px5_defconfig index e9f2c05265..bd59bc3e08 100644 --- a/configs/evb-px5_defconfig +++ b/configs/evb-px5_defconfig @@ -2,6 +2,7 @@ CONFIG_ARM=y CONFIG_ARCH_ROCKCHIP=y CONFIG_SYS_MALLOC_F_LEN=0x1000 CONFIG_ROCKCHIP_RK3368=y +CONFIG_ROCKCHIP_PX5=y CONFIG_TARGET_EVB_PX5=y CONFIG_DEFAULT_DEVICE_TREE="rk3368-px5-evb" CONFIG_DEBUG_UART=y -- cgit v1.2.3 From ddc9405d5b187854d748d65682f593fc8f675dc1 Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Mon, 25 Mar 2019 18:10:06 +0800 Subject: rockchip: spl: move arch_cpu_init() after spl_init() arch_cpu_init() may use DM to get cru handler. Change-Id: I5f2daa4718bcdcc5a4aa5601d26e9f4f31a01b69 Signed-off-by: Kever Yang --- arch/arm/mach-rockchip/spl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/mach-rockchip/spl.c b/arch/arm/mach-rockchip/spl.c index 2c1ffe5ab0..df60b15b93 100644 --- a/arch/arm/mach-rockchip/spl.c +++ b/arch/arm/mach-rockchip/spl.c @@ -147,7 +147,6 @@ void board_init_f(ulong dummy) #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); -- cgit v1.2.3 From 21379abcb5a9252da69d88c444e8ff407c16ee45 Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Tue, 26 Mar 2019 08:58:45 +0800 Subject: rockchip: tpl: remove arch_cpu_init() The arch_cpu_init() should be done in SPL only. Change-Id: If96bad9694dbcb0d9821433d1f2cbead4517633c Signed-off-by: Kever Yang --- arch/arm/mach-rockchip/tpl.c | 6 ------ 1 file changed, 6 deletions(-) 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 /* -- cgit v1.2.3 From d74e8763bbca548e053f60da392498b97717cd52 Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Tue, 26 Mar 2019 16:10:35 +0800 Subject: rockchip: spl: always try to init stimer We always try to init stimer in case it's not init in previous stage, but don't re-init if it already work. Change-Id: I2133804560c6e31e51e6b2cb0a6e51b9544970d3 Signed-off-by: Kever Yang --- arch/arm/mach-rockchip/spl.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/arm/mach-rockchip/spl.c b/arch/arm/mach-rockchip/spl.c index df60b15b93..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,9 +147,7 @@ void board_init_f(ulong dummy) #endif #endif -#if !defined(CONFIG_SUPPORT_TPL) rockchip_stimer_init(); -#endif #define EARLY_UART #if defined(EARLY_UART) && defined(CONFIG_DEBUG_UART) /* -- cgit v1.2.3 From a739a3a9b7d60a7b5ae7a0b9f9b4a3c7a4eb6d97 Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Wed, 30 Jan 2019 18:08:08 +0800 Subject: rockchip: px5 update dts for spl/tpl TPL need dmc to init ddr sdram, and emmc, boot-order. Change-Id: Ia783e1a47a7710bf618c556eefaf354b7097eacd Signed-off-by: Kever Yang --- arch/arm/dts/rk3368-px5-evb-u-boot.dtsi | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) 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 = ; + rockchip,ddr-frequency = <800000000>; + rockchip,ddr-speed-bin = ; + + 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; +}; -- cgit v1.2.3 From 1d0603dbce3485da9267d83d4b9f353417a48a42 Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Tue, 12 Feb 2019 15:20:47 +0800 Subject: rockchip: px5: update SPL size for spl/tpl Change-Id: I447976f9030a59f18393027e8392a065d4c6c425 Signed-off-by: Kever Yang --- include/configs/evb_px5.h | 1 + include/configs/rk3368_common.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) 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 #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 4f9105edac..5ef4a3b9f2 100644 --- a/include/configs/rk3368_common.h +++ b/include/configs/rk3368_common.h @@ -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 -- cgit v1.2.3 From 2d2b0663a109af1f541236e38c01d7b148df05fd Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Tue, 12 Feb 2019 15:19:07 +0800 Subject: rockchip: px5: update defconfig for TPL/SPL Change-Id: I4dcb2b3712fe87eece374c93cdc22d01edbd503a Signed-off-by: Kever Yang --- configs/evb-px5_defconfig | 53 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/configs/evb-px5_defconfig b/configs/evb-px5_defconfig index bd59bc3e08..68fbce641d 100644 --- a/configs/evb-px5_defconfig +++ b/configs/evb-px5_defconfig @@ -1,29 +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 -- cgit v1.2.3 From 618713d1f2e2bca0ca94522aa5a34b2806d2dfe0 Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Thu, 15 Nov 2018 16:00:00 +0800 Subject: arm64: enable async error handler Enable the exception handler for async error so that we can get the abort before kernel. Change-Id: Ie0e7c89a0d03adf3b74b0d9ddf8c9117536dac6b Signed-off-by: Kever Yang --- arch/arm/lib/crt0_64.S | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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,7 +65,25 @@ */ 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). */ -- cgit v1.2.3 From a90f2861de2b6b54441e45664fd03e1cbb7fa567 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 26 Mar 2019 20:58:28 +0800 Subject: lib: sysmem: fix NULL attr.name Change-Id: I93744c28668d1533ec2bcdaafc9198d8557284a1 Signed-off-by: Joseph Chen --- lib/sysmem.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/sysmem.c b/lib/sysmem.c index b050177af1..f0b486d687 100644 --- a/lib/sysmem.c +++ b/lib/sysmem.c @@ -210,6 +210,8 @@ static void *sysmem_alloc_align_base(enum memblk_id id, } 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; -- cgit v1.2.3 From c5449fd30c8bd2024331ddf912fa467e4487c20b Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 26 Mar 2019 11:29:19 +0800 Subject: dm: dvfs: don't print fail message when there is no device Change-Id: I8ec8920972261e8009dfd9306d8ab898460a71df Signed-off-by: Joseph Chen --- cmd/dvfs.c | 3 ++- drivers/power/dvfs/dvfs-uclass.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) 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/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; } -- cgit v1.2.3 From daa679a7e421fa6b1852298c94c1246fead328b1 Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Wed, 27 Mar 2019 18:08:15 +0800 Subject: rockchip: make.sh: get CONFIG_SYS_TEXT_BASE from .config CONFIG_SYS_TEXT_BASE define in header file has be deprecate on mainline, it has been move to Kconfig. Change-Id: I40ae0ab84dbc6d74eca3450413fc2d11eb098434 Signed-off-by: Kever Yang --- make.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/make.sh b/make.sh index 023e539dfa..88d20109dc 100755 --- a/make.sh +++ b/make.sh @@ -507,6 +507,10 @@ pack_uboot_image() local UBOOT_LOAD_ADDR 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 -- cgit v1.2.3 From 327c34ef1dadf06eb5d7b8089833dea439aa94ad Mon Sep 17 00:00:00 2001 From: Shengfei Xu Date: Wed, 13 Mar 2019 16:11:23 +0800 Subject: fuel gauge: rk817/rk809: only rk809 need pull-up and pull-down resistor Change-Id: I9c88a0cf11205ba351305eb37bd1e725ed203dca Signed-off-by: Shengfei Xu --- drivers/power/fuel_gauge/fg_rk817.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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; } -- cgit v1.2.3 From b86137850ec8304d443acb4133e25d43643a0d7f Mon Sep 17 00:00:00 2001 From: Hisping Lin Date: Fri, 22 Mar 2019 10:11:25 +0800 Subject: lib: optee_client: change condition for file exist file not exist if ret < 0, file exist if ret >=0 Change-Id: I1a70b0a41773f03d552c5f6cda82b745d6e81421 Signed-off-by: Hisping Lin --- lib/optee_clientApi/OpteeClientRkFs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/optee_clientApi/OpteeClientRkFs.c b/lib/optee_clientApi/OpteeClientRkFs.c index 53a2ebcaca..68c59554e8 100644 --- a/lib/optee_clientApi/OpteeClientRkFs.c +++ b/lib/optee_clientApi/OpteeClientRkFs.c @@ -1316,7 +1316,7 @@ 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; -- cgit v1.2.3 From 0476014ebb59f4b6ab5b30c8b192ebec6ac99655 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 19 Mar 2019 14:16:19 +0800 Subject: ram: ramdisk: rename "readonly" to "ro" Change-Id: I4f7c052e5750db78969f37125056906cacd222a0 Signed-off-by: Joseph Chen --- arch/arm/dts/rk3399pro-npu-evb.dts | 4 +-- configs/rk3399pro-npu_defconfig | 2 +- drivers/ram/Kconfig | 2 +- drivers/ram/Makefile | 2 +- drivers/ram/ramdisk_readonly.c | 61 -------------------------------------- drivers/ram/ramdisk_ro.c | 61 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 66 insertions(+), 66 deletions(-) delete mode 100644 drivers/ram/ramdisk_readonly.c create mode 100644 drivers/ram/ramdisk_ro.c 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/configs/rk3399pro-npu_defconfig b/configs/rk3399pro-npu_defconfig index 7b59efdf56..7555476382 100644 --- a/configs/rk3399pro-npu_defconfig +++ b/configs/rk3399pro-npu_defconfig @@ -56,7 +56,7 @@ CONFIG_PINCTRL=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/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_readonly.c deleted file mode 100644 index 7f2b3b8c7a..0000000000 --- a/drivers/ram/ramdisk_readonly.c +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2018 Rockchip Electronics Co., Ltd - */ - -#include -#include -#include -#include -#include -#include - -DECLARE_GLOBAL_DATA_PTR; - -static ulong ramdisk_readonly_bread(struct blk_desc *desc, lbaint_t start, - lbaint_t blkcnt, void *dst) -{ - unsigned long b_size, b_start; - - /* Byte */ - b_start = start * desc->blksz; - b_size = blkcnt * desc->blksz; - memcpy((char *)dst, (char *)b_start, b_size); - - debug("%s: b_start=0x%lx, b_size=0x%lx. dst=%p\n", - __func__, b_start, b_size, dst); - - return blkcnt; -} - -static int ramdisk_readonly_bind(struct udevice *dev) -{ - struct udevice *bdev; - int ret; - - ret = blk_create_devicef(dev, "ramdisk_blk", "blk", - IF_TYPE_RAMDISK, 0, 512, 0, &bdev); - if (ret) { - debug("Can't create block device\n"); - return ret; - } - - return 0; -} - -static const struct ramdisk_ops ramdisk_readonly_ops = { - .read = ramdisk_readonly_bread, -}; - -static const struct udevice_id ramdisk_readonly_ids[] = { - { .compatible = "ramdisk-readonly" }, - { } -}; - -U_BOOT_DRIVER(ramdisk_readonly) = { - .name = "ramdisk-readonly", - .id = UCLASS_RAMDISK, - .ops = &ramdisk_readonly_ops, - .of_match = ramdisk_readonly_ids, - .bind = ramdisk_readonly_bind, -}; diff --git a/drivers/ram/ramdisk_ro.c b/drivers/ram/ramdisk_ro.c new file mode 100644 index 0000000000..e2f5c29b54 --- /dev/null +++ b/drivers/ram/ramdisk_ro.c @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2018 Rockchip Electronics Co., Ltd + */ + +#include +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +static ulong ramdisk_ro_bread(struct blk_desc *desc, lbaint_t start, + lbaint_t blkcnt, void *dst) +{ + unsigned long b_size, b_start; + + /* Byte */ + b_start = start * desc->blksz; + b_size = blkcnt * desc->blksz; + memcpy((char *)dst, (char *)b_start, b_size); + + debug("%s: b_start=0x%lx, b_size=0x%lx. dst=%p\n", + __func__, b_start, b_size, dst); + + return blkcnt; +} + +static int ramdisk_ro_bind(struct udevice *dev) +{ + struct udevice *bdev; + int ret; + + ret = blk_create_devicef(dev, "ramdisk_blk", "blk", + IF_TYPE_RAMDISK, 0, 512, 0, &bdev); + if (ret) { + debug("Can't create block device\n"); + return ret; + } + + return 0; +} + +static const struct ramdisk_ops ramdisk_ro_ops = { + .read = ramdisk_ro_bread, +}; + +static const struct udevice_id ramdisk_ro_ids[] = { + { .compatible = "ramdisk-ro" }, + { } +}; + +U_BOOT_DRIVER(ramdisk_ro) = { + .name = "ramdisk-ro", + .id = UCLASS_RAMDISK, + .ops = &ramdisk_ro_ops, + .of_match = ramdisk_ro_ids, + .bind = ramdisk_ro_bind, +}; -- cgit v1.2.3 From 5743ef647faabacaf12f7272c027f0ea6dee8557 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Fri, 22 Feb 2019 21:48:53 +0800 Subject: mmc: dw_mmc: support get_cd in struct dm_mmc_ops Add function get_cd to detect storage device directly instead of detect it by mmc command. Change-Id: I486dee836c62092baabe40fc6de995904849f91d Signed-off-by: Jason Zhu --- drivers/mmc/dw_mmc.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index 3a13b51a41..81981c7911 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -13,6 +13,10 @@ #include #include #include +#ifdef CONFIG_DM_GPIO +#include +#include +#endif #define PAGE_SIZE 4096 @@ -623,6 +627,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 +657,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 +666,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, }; -- cgit v1.2.3 From 1380460aeec611722e2e9224b49a8941764a8f3b Mon Sep 17 00:00:00 2001 From: XiaoDong Huang Date: Thu, 28 Mar 2019 16:20:49 +0800 Subject: rockchip: rk3368: Use timer0 as timer_irq Change-Id: I75ee18ee55207ead6a30d588529e7363fe361009 Signed-off-by: XiaoDong Huang --- include/irq-platform.h | 3 ++- include/rk_timer_irq.h | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) 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/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 -- cgit v1.2.3 From b13cc84cd1500488737e1936da4a4015d6bb7b6d Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Thu, 28 Mar 2019 20:18:42 +0800 Subject: rockchip: efuse: support rk1808 non-secure efuse Change-Id: I2a7cc8306c5ea45c5586b036cbc13eaa153e4227 Signed-off-by: Finley Xiao --- drivers/misc/rockchip-efuse.c | 114 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) 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 #include +#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) { @@ -269,6 +379,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, -- cgit v1.2.3 From 4973d825b84c2eb1da633d671dd287663966d771 Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Tue, 23 Oct 2018 09:46:24 +0800 Subject: rockchip: otp: Add (misc) driver for PX30 non-secure OTP block This adds a simple driver for reading the OTP block of the PX30. Change-Id: Ic2c0f4b0886808af87c826e8d0045e5d440521f7 Signed-off-by: Finley Xiao --- drivers/misc/Kconfig | 7 ++ drivers/misc/Makefile | 1 + drivers/misc/rockchip-otp.c | 209 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 217 insertions(+) create mode 100644 drivers/misc/rockchip-otp.c 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-otp.c b/drivers/misc/rockchip-otp.c new file mode 100644 index 0000000000..e773583bd9 --- /dev/null +++ b/drivers/misc/rockchip-otp.c @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd + */ + +#include +#include +#include +#include +#include +#include +#include + +/* 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, + }, + {} +}; + +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), +}; -- cgit v1.2.3 From 6be53b633a21a4024eb11bc8e4ccfa7c730ae55e Mon Sep 17 00:00:00 2001 From: Finley Xiao Date: Thu, 28 Mar 2019 19:46:24 +0800 Subject: rockchip: otp: Add support for RK3308 Change-Id: I44391e0f039b1bd347124e90aad67a936ade2f99 Signed-off-by: Finley Xiao --- drivers/misc/rockchip-otp.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/misc/rockchip-otp.c b/drivers/misc/rockchip-otp.c index e773583bd9..c6ec5d9b3f 100644 --- a/drivers/misc/rockchip-otp.c +++ b/drivers/misc/rockchip-otp.c @@ -196,6 +196,10 @@ 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, + }, {} }; -- cgit v1.2.3 From 623d03d6217fc9b49e4d02fa876d7505d94974f8 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 26 Mar 2019 15:22:33 +0800 Subject: make.sh: pack ta trust.img as primary choice This U-Boot is working with kernel-4.4 at least which requires trust.img with ta. It also avoids user confused with trust.img and trust_with_ta.img. Change-Id: I18ec538a1f83cbb660e2fda597bf8120863d744f Signed-off-by: Joseph Chen --- make.sh | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/make.sh b/make.sh index 88d20109dc..98b0a00b9c 100755 --- a/make.sh +++ b/make.sh @@ -592,16 +592,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 -- cgit v1.2.3 From 356575c3e2938bc78c92d884f8e4b72cfa1963f1 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 27 Mar 2019 11:53:16 +0800 Subject: lib: bidram: handle only-one dram bank available situation LMB default init lmb->reserved.region[0] as zero. Change-Id: Ib46d9630581bb3a03c5846288b16ae805e3e6944 Signed-off-by: Joseph Chen --- lib/bidram.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/bidram.c b/lib/bidram.c index d39f5b14ae..b6859150fd 100644 --- a/lib/bidram.c +++ b/lib/bidram.c @@ -130,6 +130,20 @@ void bidram_gen_gd_bi_dram(void) 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; @@ -209,7 +223,7 @@ static int bidram_core_reserve(enum memblk_id id, const char *mem_name, /* Check overlap */ list_for_each(node, &bidram->reserved_head) { mem = list_entry(node, struct memblock, node); - BIDRAM_D("Reserved: %s 0x%08lx - 0x%08lx\n", + 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)) { @@ -224,6 +238,9 @@ static int bidram_core_reserve(enum memblk_id id, const char *mem_name, } } + 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)); -- cgit v1.2.3 From 2cb995bc2ea3681c63d81b053299172173171440 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 29 Mar 2019 18:01:51 +0800 Subject: lib: sysmem: allow alloc subset of an allocated memblk Change-Id: I171c5978faf6fc1b3e95cc46c55a2adfe6df0176 Signed-off-by: Joseph Chen --- lib/sysmem.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/sysmem.c b/lib/sysmem.c index f0b486d687..8b08644a74 100644 --- a/lib/sysmem.c +++ b/lib/sysmem.c @@ -244,6 +244,9 @@ static void *sysmem_alloc_align_base(enum memblk_id id, 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(mem->base, mem->size, base, size)) { -- cgit v1.2.3 From 5330794924424b7839dd5869a9061ed87256d2b4 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 28 Mar 2019 14:28:43 +0800 Subject: scripts: stacktrace.sh: dump PC and LR addr2line information Change-Id: If5c017eb3440b587153fa6b8624bf4acffe5a4e5 Signed-off-by: Joseph Chen --- scripts/stacktrace.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 -- cgit v1.2.3 From 36620717fd5981b5e00c9f2658fca13dada9ecde Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 27 Mar 2019 20:43:23 +0800 Subject: arm: stacktrace: imporve guidance message Change-Id: I186f80f64104b79d35aaae03e99a484bd1191c8f Signed-off-by: Joseph Chen --- arch/arm/lib/stacktrace.c | 4 +++- arch/arm/lib/stacktrace_64.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) 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) -- cgit v1.2.3 From ca13d12f664966c897e8ef0aab47bd2140c5b9c7 Mon Sep 17 00:00:00 2001 From: Yifeng Zhao Date: Fri, 15 Mar 2019 17:12:19 +0800 Subject: drivers: mtd: nand: add rockchip nandc v9 drivers Change-Id: I7019f309528d41710c5af6857a4d4f54037dd595 Signed-off-by: Yifeng Zhao --- drivers/mtd/nand/Kconfig | 8 + drivers/mtd/nand/Makefile | 2 +- drivers/mtd/nand/rockchip_nand_v9.c | 691 ++++++++++++++++++++++++++++++++++++ 3 files changed, 700 insertions(+), 1 deletion(-) create mode 100644 drivers/mtd/nand/rockchip_nand_v9.c 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/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 + * Copyright (c) 2017 PaweÅ‚ Jarosz + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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) {} -- cgit v1.2.3 From 204f7c3926e3cc28fb4211b08735ab9131bf1748 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Fri, 29 Mar 2019 09:46:12 +0800 Subject: mmc: dw_mmc: fix sd card power enable errror The sd card power is enabled when PWREN is set low by rockchip hardware design. Change-Id: I4fb54235bd5235030146f77be1e07dc4e729ae06 Signed-off-by: Jason Zhu --- drivers/mmc/dw_mmc.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index 81981c7911..f8347f0c52 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -584,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__); -- cgit v1.2.3 From ba76dc003ef1ce07b28460639347507719df7946 Mon Sep 17 00:00:00 2001 From: Shengfei Xu Date: Wed, 13 Feb 2019 09:49:38 +0800 Subject: power: pmic: rk8xx: enable under-voltage protection to rk817/rk809 The under-voltage protection will shutdown the LDO3 and reset the PMIC. Change-Id: Ic84c7ad1a2eed8c1f983e761988ffb903fc878af Signed-off-by: Shengfei Xu --- drivers/power/pmic/rk8xx.c | 10 ++++++---- include/power/rk8xx_pmic.h | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) 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/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 -- cgit v1.2.3 From 305d8903e0837a7762424ebd11848394c864e1ac Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 28 Mar 2019 15:31:47 +0800 Subject: lib: sysmem: improve kernel reserved-memory alloc - If the region is out of avaiable dram bank, return success; - region can override allocated memblk with attr M_ATTR_OVERLAP; Change-Id: I02171cdb51462e9cec3dd955ae3e0aaaa0ee7afd Signed-off-by: Joseph Chen --- lib/sysmem.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/sysmem.c b/lib/sysmem.c index 8b08644a74..952a5e1894 100644 --- a/lib/sysmem.c +++ b/lib/sysmem.c @@ -194,7 +194,10 @@ static void *sysmem_alloc_align_base(enum memblk_id id, phys_addr_t paddr; phys_addr_t alloc_base; phys_size_t alloc_size; - bool req_overlap = false; + 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; @@ -204,8 +207,20 @@ static void *sysmem_alloc_align_base(enum memblk_id id, SYSMEM_E("NULL name for alloc sysmem\n"); return NULL; } else if (id == MEMBLK_ID_FDT_RESV) { - req_overlap = true; - if (base >= gd->ram_top) + 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); -- cgit v1.2.3 From 9560dcb992fdee783bebd208bb8e140a78d47bc2 Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Fri, 29 Mar 2019 20:35:08 +0800 Subject: rockchip: rk3368: fix uart2 iomux RK3368 uart2 iomux config is not correct, fix it. Change-Id: I992c4b0ae9d8c0a91c5ee1fb3e7850a1e94db206 Signed-off-by: Kever Yang --- arch/arm/mach-rockchip/rk3368/rk3368.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-rockchip/rk3368/rk3368.c b/arch/arm/mach-rockchip/rk3368/rk3368.c index 5fe2f3f19f..46e63c9d7f 100644 --- a/arch/arm/mach-rockchip/rk3368/rk3368.c +++ b/arch/arm/mach-rockchip/rk3368/rk3368.c @@ -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) @@ -276,9 +278,9 @@ void board_debug_uart_init(void) #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 } -- cgit v1.2.3 From 9ac41981038a7853d10517340630d830b07f0503 Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Wed, 3 Apr 2019 17:15:05 +0800 Subject: rockchip: rk3328: add boot order in chosen Default boot from sdcard may fail in evb without sd. Change-Id: Ifde49b6b28e7154a14f5e028d9863446f11cb59c Signed-off-by: Kever Yang --- arch/arm/dts/rk3328-u-boot.dtsi | 1 + 1 file changed, 1 insertion(+) 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; }; -- cgit v1.2.3 From 04e429a4cdf5db388fc52eb015456b444856383e Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Fri, 29 Mar 2019 18:19:11 +0800 Subject: scripts: add mkkrnlimg tool to pack rockchip format image sync from kernel develop-4.4: (3091608 arm64: dts: rockchip: fixup vccio3-supply for ai-va-v10) Change-Id: I4c67dfc617c99791d2706e2b260a79fd3419b29d Signed-off-by: Joseph Chen --- scripts/mkkrnlimg | Bin 0 -> 13214 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 scripts/mkkrnlimg diff --git a/scripts/mkkrnlimg b/scripts/mkkrnlimg new file mode 100755 index 0000000000..f8601d3ee0 Binary files /dev/null and b/scripts/mkkrnlimg differ -- cgit v1.2.3 From de573281d825ca91bfe0573343051bfb169d90e9 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 3 Apr 2019 17:40:42 +0800 Subject: rockchip: dts: rk3399-evb: rename key node Use different name for the volume up key node, dm framework can't support the same device node since kernel dtb is enabled. Change-Id: Ia99c9b8fd46fea63949f9d06072c0ebec0e76a46 Signed-off-by: Joseph Chen --- arch/arm/dts/rk3399-evb.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 = ; 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 = ; label = "volume up"; -- cgit v1.2.3 From 5ae28c899a83ad1e62e928d6e833cb3f8916e13e Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 3 Apr 2019 18:12:42 +0800 Subject: rockchip: dts: rk3229-evb: support recovery GPIO key RK3229 hardware design reference is GPIO3_D1. Change-Id: I49807081212c77a84d38200a87449eb91dc5a7d3 Signed-off-by: Joseph Chen --- arch/arm/dts/rk3229-evb.dts | 13 +++++++++++++ arch/arm/dts/rk322x-u-boot.dtsi | 10 ++++++++++ 2 files changed, 23 insertions(+) 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 = ; + 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 7034b344e1..3d73382141 100644 --- a/arch/arm/dts/rk322x-u-boot.dtsi +++ b/arch/arm/dts/rk322x-u-boot.dtsi @@ -62,6 +62,16 @@ status = "okay"; }; +&pinctrl { + u-boot,dm-pre-reloc; + status = "okay"; +}; + &gpio1 { u-boot,dm-pre-reloc; }; + +&gpio3 { + u-boot,dm-pre-reloc; + status = "okay"; +}; -- cgit v1.2.3 From 4388deca723e78cda09c928f33f3a4d299e414c9 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 21 Mar 2019 18:22:13 +0800 Subject: dm: add amp uclass and rockchip amp driver support - add amp uclass; - add a simple rockchip amp driver. 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 Change-Id: I127d5d9f460ec0c1812a76fb4c3702e82f21c9a6 Signed-off-by: Joseph Chen --- Makefile | 1 + drivers/cpu/Kconfig | 12 ++++ drivers/cpu/Makefile | 2 + drivers/cpu/amp-uclass.c | 162 +++++++++++++++++++++++++++++++++++++++++++++ drivers/cpu/rockchip_amp.c | 130 ++++++++++++++++++++++++++++++++++++ include/amp.h | 29 ++++++++ include/dm/uclass-id.h | 1 + 7 files changed, 337 insertions(+) create mode 100644 drivers/cpu/amp-uclass.c create mode 100644 drivers/cpu/rockchip_amp.c create mode 100644 include/amp.h diff --git a/Makefile b/Makefile index efedc288d4..dc812e2d97 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/ 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 +#include +#include +#include + +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 +#include +#include +#include +#include +#include +#include + +#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/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 + +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/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) */ -- cgit v1.2.3 From a0ceee92279dd8ae8d6561b24ca83eb310975159 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 2 Apr 2019 13:13:31 +0800 Subject: rockchip: support early load dtb from distro images It is optional to use dtb from distro images to initialize periph drivers when kernel dtb function is enabled. Change-Id: I7119962ba61d84c5ccdf2e515e21bb347e50b91b Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/Kconfig | 16 ++++++++ arch/arm/mach-rockchip/resource_img.c | 72 +++++++++++++++++++++++++++++++---- 2 files changed, 80 insertions(+), 8 deletions(-) diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig index 880171f022..040a117dec 100644 --- a/arch/arm/mach-rockchip/Kconfig +++ b/arch/arm/mach-rockchip/Kconfig @@ -559,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/resource_img.c b/arch/arm/mach-rockchip/resource_img.c index d2742fbad7..50598d89fd 100755 --- a/arch/arm/mach-rockchip/resource_img.c +++ b/arch/arm/mach-rockchip/resource_img.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -628,17 +629,72 @@ 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; + int size = -ENODEV; if (list_empty(&entrys_head)) { - ret = init_resource_list(NULL); - if (ret) - return ret; + 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) { @@ -668,13 +724,13 @@ int rockchip_read_dtb_file(void *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; } -- cgit v1.2.3 From 5a54baa79344007142206f4dab5dd46d8ea1dc91 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 3 Apr 2019 17:22:27 +0800 Subject: dm: key: refactor code - use standard dm framework to implement all key drivers; - all key node to be children and attach to key bus; - dm key uclass takes over most work; - reduce a lot of driver code size; Change-Id: I9ea4515249d493eb4434890b90350f694c07404f Signed-off-by: Joseph Chen --- drivers/input/Kconfig | 2 +- drivers/input/adc_key.c | 113 ++++++-------- drivers/input/gpio_key.c | 130 ++++------------ drivers/input/key-uclass.c | 349 +++++++++++++++++++++++++------------------ drivers/input/rk8xx_pwrkey.c | 34 ++--- drivers/input/rk_key.c | 156 +++++-------------- include/key.h | 26 ++-- 7 files changed, 350 insertions(+), 460 deletions(-) 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 -#include -#include #include -#include -#include -#include -#include +#include #include -#include -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", - µvolt); - 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 -#include #include -#include #include -#include -#include -#include #include -#include -#include -#include -#include -#include - -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 #include #include +#include +#include -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 -#include #include -#include #include -#include -#include -#include #include -#include -#include -#include -#include -#include -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/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 -- cgit v1.2.3 From 8d681e4412b383ac32a7768921524eec37f99994 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 26 Mar 2019 15:50:10 +0800 Subject: common: android: only adjust load address for ARM64 compressed kernel If there is not "kernel_addr_c", using "kernel_addr_r" for Image/zImage on 32-bit platform. If there is not "kernel_addr_c", adjust load address to promise compressed kernel can normal boot on 64-bit platform. Change-Id: I42cc3c9074eb8f1caaa44d9256d2abdae6cd97b8 Signed-off-by: Joseph Chen --- common/image-android.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/common/image-android.c b/common/image-android.c index 64374b10e4..cf436da62c 100644 --- a/common/image-android.c +++ b/common/image-android.c @@ -413,15 +413,31 @@ 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; + + 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) { -- cgit v1.2.3 From 6115fdb3c07a7c9989f25099bc9b0f18c2b255df Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 26 Mar 2019 20:01:49 +0800 Subject: common: android: improve os image information android_image_parse_kernel_comp() doesn't return valid os compressed type after android_image_set_kload(), so we add the env "os_comp" to record compressed type. Change-Id: Ie175649d348c0578ce78e139bdbbf4b6f9ea1101 Signed-off-by: Joseph Chen --- common/android_bootloader.c | 32 ++++++++++++++++++++------------ common/image-android.c | 1 + 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/common/android_bootloader.c b/common/android_bootloader.c index 68535abbc8..e6da05a098 100644 --- a/common/android_bootloader.c +++ b/common/android_bootloader.c @@ -308,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", @@ -326,15 +326,23 @@ 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); if (gd->console_evt == CONSOLE_EVT_CTRL_M) { bidram_dump(); diff --git a/common/image-android.c b/common/image-android.c index cf436da62c..048de0f7ea 100644 --- a/common/image-android.c +++ b/common/image-android.c @@ -419,6 +419,7 @@ long android_image_load(struct blk_desc *dev_desc, if (comp != IH_COMP_NONE) { 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; -- cgit v1.2.3 From 4e92aae1f9ac4962fe2f928aff4e64767bc8b05b Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 4 Apr 2019 12:18:05 +0800 Subject: rockchip: param: remove some function compile for TPL/SPL Change-Id: I828e14d12c056a7dbc8a5a8863f2f0fab4285d22 Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/param.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/mach-rockchip/param.c b/arch/arm/mach-rockchip/param.c index 8f88958192..42d5ef7636 100644 --- a/arch/arm/mach-rockchip/param.c +++ b/arch/arm/mach-rockchip/param.c @@ -12,6 +12,7 @@ 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) @@ -195,6 +196,7 @@ int param_parse_bootdev(char **devtype, char **devnum) return -ENOSYS; } +#endif struct memblock *param_parse_ddr_mem(int *out_count) { -- cgit v1.2.3 From 2dd104a51f8faae529ea796f22e5178520d5dfdb Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 26 Mar 2019 19:59:36 +0800 Subject: rockchip: param: set common reserved memory only for ARM64 Follow legacy U-Boot rules(branch: rkdevelop). Change-Id: Id181baf1b3fe77f2bf5f15405b1a7618920cbed1 Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/param.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-rockchip/param.c b/arch/arm/mach-rockchip/param.c index 42d5ef7636..6cf867686e 100644 --- a/arch/arm/mach-rockchip/param.c +++ b/arch/arm/mach-rockchip/param.c @@ -145,9 +145,12 @@ struct memblock param_parse_common_resv_mem(void) { struct memblock mem; +#ifdef CONFIG_ARM64 mem.base = SDRAM_OFFSET(SZ_1M); mem.size = SZ_1M; - +#else + mem.size = 0; +#endif return mem; } -- cgit v1.2.3 From 4862a585bcf0b5993437014f3a91b52a1297568d Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 21 Mar 2019 10:32:58 +0800 Subject: configs: rk3399pro-npu: enable fan53555 regulator Change-Id: I71a45e5dc77fefd4278c9fa8ca0dd8f0f31cdd32 Signed-off-by: Joseph Chen --- configs/rk3399pro-npu_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/rk3399pro-npu_defconfig b/configs/rk3399pro-npu_defconfig index 7555476382..bcc3cd3703 100644 --- a/configs/rk3399pro-npu_defconfig +++ b/configs/rk3399pro-npu_defconfig @@ -53,6 +53,7 @@ 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 -- cgit v1.2.3 From 23adb58f0c42ab1bb8baa7ffc4c72734011eaee9 Mon Sep 17 00:00:00 2001 From: David Wu Date: Fri, 1 Mar 2019 20:06:00 +0800 Subject: net: Add rk3308 mac support Change-Id: I143e7847e2249fafdcbcdaf69ff3a88915674836 Signed-off-by: David Wu --- drivers/net/gmac_rockchip.c | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/drivers/net/gmac_rockchip.c b/drivers/net/gmac_rockchip.c index 172d423e2e..47605b1b19 100644 --- a/drivers/net/gmac_rockchip.c +++ b/drivers/net/gmac_rockchip.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -140,6 +141,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; @@ -330,6 +372,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; @@ -552,6 +610,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, @@ -577,6 +640,8 @@ static const struct udevice_id rockchip_gmac_ids[] = { .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", -- cgit v1.2.3 From c4ff7367d6e344ed78dde06b38da64676f0e363c Mon Sep 17 00:00:00 2001 From: David Wu Date: Fri, 1 Mar 2019 20:06:29 +0800 Subject: config: evb-rk3308: Enable GMAC config Change-Id: I6884fbce580e677981daa142e611248e38ef4952 Signed-off-by: David Wu --- configs/evb-aarch32-rk3308_defconfig | 3 +++ configs/evb-rk3308_defconfig | 3 +++ configs/rk3308-aarch32_defconfig | 3 +++ configs/rk3308_defconfig | 3 +++ 4 files changed, 12 insertions(+) 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-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/rk3308-aarch32_defconfig b/configs/rk3308-aarch32_defconfig index 956d0cd2aa..ffa565e3d6 100644 --- a/configs/rk3308-aarch32_defconfig +++ b/configs/rk3308-aarch32_defconfig @@ -55,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 bacbaabd9d..84b02619d3 100644 --- a/configs/rk3308_defconfig +++ b/configs/rk3308_defconfig @@ -54,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 -- cgit v1.2.3 From 200683ea3d1db7d51b77da840b8e8333c04dcdf7 Mon Sep 17 00:00:00 2001 From: David Wu Date: Wed, 13 Mar 2019 11:33:55 +0800 Subject: clk: rockchip: Add mac clock support for rk3308 Change-Id: I972e2b7977f0f94164c72ae2205ec51780eb7373 Signed-off-by: David Wu --- arch/arm/include/asm/arch-rockchip/cru_rk3308.h | 17 +++++ drivers/clk/rockchip/clk_rk3308.c | 87 +++++++++++++++++++++++++ 2 files changed, 104 insertions(+) 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/drivers/clk/rockchip/clk_rk3308.c b/drivers/clk/rockchip/clk_rk3308.c index fa16d7449c..e36d64670e 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); @@ -867,6 +913,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 +1085,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) -- cgit v1.2.3 From 22125d78ab01b11a776e1caf82f8b42ab8b0f009 Mon Sep 17 00:00:00 2001 From: David Wu Date: Wed, 13 Mar 2019 11:34:50 +0800 Subject: ARM: dts: rk3308: Add mac node support at dtsi level Change-Id: I8c109a092b0fb1f9df2d7d8da905b38c7e65b0de Signed-off-by: David Wu --- arch/arm/dts/rk3308.dtsi | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) 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 = ; + 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 { -- cgit v1.2.3 From 9a272a6177cb77726dc5677adbc49395cbb08b6e Mon Sep 17 00:00:00 2001 From: David Wu Date: Wed, 13 Mar 2019 11:35:54 +0800 Subject: ARM: dts: rk3308-evb: Add mac node support at dts level for rk3308b Note: the default status of mac is disabled. Change-Id: I2f3cebb03f19f16c2553579e69e8312943d7ed75 Signed-off-by: David Wu --- arch/arm/dts/rk3308-evb.dts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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"; }; -- cgit v1.2.3 From 7e72214d51563aaf54c857ac0468b522e0002c9f Mon Sep 17 00:00:00 2001 From: Shixiang Zheng Date: Thu, 28 Mar 2019 15:26:28 +0800 Subject: video/drm: logo: the negative height will cause vop register err the bmp file has been processed when reserved equals BMP_PROCESSED_FLAG Change-Id: I793582cdd4ee5ee2a774c7a0dee8d36c81ed4f4c Signed-off-by: Shixiang Zheng --- drivers/video/drm/rockchip_display.c | 10 +++++++++- drivers/video/drm/rockchip_display.h | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/video/drm/rockchip_display.c b/drivers/video/drm/rockchip_display.c index 9f8be7d2ba..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); @@ -923,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; @@ -948,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) { @@ -995,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; }; -- cgit v1.2.3 From 03a691401ba2ee9f6a21c794803ea3fe90df63da Mon Sep 17 00:00:00 2001 From: Kever Yang Date: Wed, 3 Apr 2019 17:15:53 +0800 Subject: rockchip: rk3328: update defconfig for spl support 1. rk3328_defconfig output for tpl is too big, remove TPL_MISC 2. we need to reserve IRAM for ATF binary loading. Change-Id: Ie3286405d44386e309760b59d502224fb76ce24d Signed-off-by: Kever Yang --- configs/evb-rk3328_defconfig | 9 ++++----- configs/rk3328_defconfig | 7 +++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/configs/evb-rk3328_defconfig b/configs/evb-rk3328_defconfig index 2f2698ee51..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 @@ -40,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 @@ -55,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/rk3328_defconfig b/configs/rk3328_defconfig index b1b5bf7fd2..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,13 +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 @@ -82,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 @@ -119,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 -- cgit v1.2.3 From 981ee0bd7d280a85d8bab4760b3dfc430b0125c9 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Tue, 9 Apr 2019 17:32:46 +0800 Subject: clk: rockchip: rk3399: support pclk_wdt get rate Change-Id: I8634beb815d5129534c36861c2f02e62669889e9 Signed-off-by: Elaine Zhang --- drivers/clk/rockchip/clk_rk3399.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) 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: -- cgit v1.2.3 From a4e491228b935c87d7ee42ccc2c5991f7c2a5b09 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Tue, 9 Apr 2019 17:34:11 +0800 Subject: clk: rockchip: rk3368: support pclk_wdt get rate Change-Id: I8253532cfa6a1d492d68b0e778f625621cad5dab Signed-off-by: Elaine Zhang --- arch/arm/include/asm/arch-rockchip/cru_rk3368.h | 4 ++++ drivers/clk/rockchip/clk_rk3368.c | 15 +++++++++++++++ 2 files changed, 19 insertions(+) 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/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; -- cgit v1.2.3 From 8afd7ff1e3da102bf2b387ae89a8c702129a85e2 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Tue, 9 Apr 2019 17:34:58 +0800 Subject: clk: rockchip: px30: support pclk_wdt get rate Change-Id: I1d58d032c6f3843df3fdee65b1ee9cd3614435b1 Signed-off-by: Elaine Zhang --- drivers/clk/rockchip/clk_px30.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/clk/rockchip/clk_px30.c b/drivers/clk/rockchip/clk_px30.c index b36f16bc3e..ed1253ab24 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; @@ -1202,6 +1203,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: -- cgit v1.2.3 From 68d8964cb4ed53067599ec6739e8bfa5743e43c2 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Tue, 9 Apr 2019 17:35:43 +0800 Subject: clk: rockchip: rk1808: support pclk_wdt get rate Change-Id: Ib204b4c014c3b4cbd35d1f335378b0b399689303 Signed-off-by: Elaine Zhang --- drivers/clk/rockchip/clk_rk1808.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/clk/rockchip/clk_rk1808.c b/drivers/clk/rockchip/clk_rk1808.c index 9639065fc4..f9e51d0e04 100644 --- a/drivers/clk/rockchip/clk_rk1808.c +++ b/drivers/clk/rockchip/clk_rk1808.c @@ -583,6 +583,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 +823,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: -- cgit v1.2.3 From 33a03efd7a8193e51a2e10c88cd026a204b25050 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Tue, 9 Apr 2019 17:36:21 +0800 Subject: clk: rockchip: rk3128: support pclk_wdt get rate Change-Id: Ie5dbfe5bd3fdd7868a5db64b96471a5524bde462 Signed-off-by: Elaine Zhang --- drivers/clk/rockchip/clk_rk3128.c | 2 ++ 1 file changed, 2 insertions(+) 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: -- cgit v1.2.3 From ced960d2b677c2376a5873ae6106eb8db847426c Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Tue, 9 Apr 2019 17:37:06 +0800 Subject: clk: rockchip: rk3288: support pclk_wdt get rate Change-Id: I99f384344feb68ae5b91ade901df4019790ef8db Signed-off-by: Elaine Zhang --- drivers/clk/rockchip/clk_rk3288.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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; -- cgit v1.2.3 From 221585fb35bf07a793d0a3471cfe7eacf10bf6be Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Tue, 9 Apr 2019 17:37:45 +0800 Subject: clk: rockchip: rk3308: support pclk_wdt get rate Change-Id: I001cfef774c9657b6286467dc4ef841771841895 Signed-off-by: Elaine Zhang --- drivers/clk/rockchip/clk_rk3308.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/clk/rockchip/clk_rk3308.c b/drivers/clk/rockchip/clk_rk3308.c index e36d64670e..75c78eaa8a 100644 --- a/drivers/clk/rockchip/clk_rk3308.c +++ b/drivers/clk/rockchip/clk_rk3308.c @@ -576,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; @@ -858,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: -- cgit v1.2.3 From 22d359b877b355666406898e61c67635748721a9 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Thu, 14 Mar 2019 09:35:13 +0800 Subject: clk: rockchip: px30: add mac clk interface support mac clk set rate and set parent. Change-Id: Iaadcb701cf37083d90a37b24f4ffba3bef9c88cd Signed-off-by: Elaine Zhang --- drivers/clk/rockchip/clk_px30.c | 83 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/drivers/clk/rockchip/clk_px30.c b/drivers/clk/rockchip/clk_px30.c index ed1253ab24..e3c73932f5 100644 --- a/drivers/clk/rockchip/clk_px30.c +++ b/drivers/clk/rockchip/clk_px30.c @@ -1055,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) @@ -1295,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; @@ -1426,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) -- cgit v1.2.3 From 18ae91c869a8eb55d8680e8180752b551ebe01ab Mon Sep 17 00:00:00 2001 From: David Wu Date: Tue, 9 Apr 2019 18:45:23 +0800 Subject: net: Add px30 gmac support Change-Id: I2c5618e74ef3e710a498795e31c6fe9e3f8d8e89 Signed-off-by: David Wu --- drivers/net/gmac_rockchip.c | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/drivers/net/gmac_rockchip.c b/drivers/net/gmac_rockchip.c index 47605b1b19..1763089f71 100644 --- a/drivers/net/gmac_rockchip.c +++ b/drivers/net/gmac_rockchip.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -82,6 +83,47 @@ 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 rk3228_gmac_fix_mac_speed(struct dw_eth_dev *priv) { struct rk322x_grf *grf; @@ -308,6 +350,22 @@ 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 rk3228_gmac_set_to_rgmii(struct gmac_rockchip_platdata *pdata) { struct rk322x_grf *grf; @@ -600,6 +658,11 @@ 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 rk3228_gmac_ops = { .fix_mac_speed = rk3228_gmac_fix_mac_speed, .set_to_rgmii = rk3228_gmac_set_to_rgmii, @@ -636,6 +699,8 @@ 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,rk3228-gmac", .data = (ulong)&rk3228_gmac_ops }, { .compatible = "rockchip,rk3288-gmac", -- cgit v1.2.3 From 9155f29fd7e004bc1b4313c45e0683f54855d7cf Mon Sep 17 00:00:00 2001 From: David Wu Date: Tue, 9 Apr 2019 18:48:14 +0800 Subject: config: px30: Enable GMAC config Change-Id: I89e6b2876c6f3269cff626411a38482661f59598 Signed-off-by: David Wu --- configs/evb-px30_defconfig | 4 +++- configs/px30_defconfig | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/configs/evb-px30_defconfig b/configs/evb-px30_defconfig index 98260f19b0..f69bf0d290 100644 --- a/configs/evb-px30_defconfig +++ b/configs/evb-px30_defconfig @@ -47,7 +47,6 @@ 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_SPL_DOS_PARTITION is not set # CONFIG_ISO_PARTITION is not set @@ -70,6 +69,9 @@ CONFIG_ADC_KEY=y CONFIG_MMC_DW=y CONFIG_MMC_DW_ROCKCHIP=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/px30_defconfig b/configs/px30_defconfig index d28f6778ae..43449a49b3 100644 --- a/configs/px30_defconfig +++ b/configs/px30_defconfig @@ -49,7 +49,6 @@ 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_SPL_DOS_PARTITION is not set # CONFIG_ISO_PARTITION is not set @@ -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 -- cgit v1.2.3 From 6078abbb1fd92695252d0047cd6cd71ca5afd227 Mon Sep 17 00:00:00 2001 From: David Wu Date: Tue, 9 Apr 2019 18:49:06 +0800 Subject: ARM: dts: px30-evb: Add gmac support at dts level for px30 Change-Id: I21d3b41b488297cb5374f74a1e28ba17f2c441f8 Signed-off-by: David Wu --- arch/arm/dts/px30-evb.dts | 15 +++++++++++++++ arch/arm/dts/px30.dtsi | 21 ++++++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) 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 a62bc03a1d..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>; @@ -2177,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>; }; }; -- cgit v1.2.3 From b9f5972251bce5af4c86c8a36c3a970b1174dbd3 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Thu, 14 Mar 2019 09:37:37 +0800 Subject: clk: rockchip: rk1808: add mac clk interface support mac clk set rate and set parent. Change-Id: I3b4626fd3fcc5ffdf3c58add9c1bc002bb56429a Signed-off-by: Elaine Zhang --- arch/arm/include/asm/arch-rockchip/cru_rk1808.h | 24 ++++++ drivers/clk/rockchip/clk_rk1808.c | 101 ++++++++++++++++++++++++ 2 files changed, 125 insertions(+) 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/drivers/clk/rockchip/clk_rk1808.c b/drivers/clk/rockchip/clk_rk1808.c index f9e51d0e04..9a8b8afe5f 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) @@ -916,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: @@ -1062,11 +1131,43 @@ 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); + 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) -- cgit v1.2.3 From 6b5ade5a57c8b15b0cd4d0eca60640de0785fae5 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Wed, 10 Apr 2019 10:16:07 +0800 Subject: clk: rockchip: rk1808: fix up the clk_set_default failed Change-Id: If49d6def0e16b93238311885217f30a4b7a2e7c3 Signed-off-by: Elaine Zhang --- drivers/clk/rockchip/clk_rk1808.c | 4 ++++ include/dt-bindings/clock/rk1808-cru.h | 1 + 2 files changed, 5 insertions(+) diff --git a/drivers/clk/rockchip/clk_rk1808.c b/drivers/clk/rockchip/clk_rk1808.c index 9a8b8afe5f..10ff010438 100644 --- a/drivers/clk/rockchip/clk_rk1808.c +++ b/drivers/clk/rockchip/clk_rk1808.c @@ -995,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; } @@ -1154,6 +1156,8 @@ 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; } 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 -- cgit v1.2.3 From 5055cc911ca1682100878e673442bc585546c5cf Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Tue, 9 Apr 2019 21:07:36 +0800 Subject: Makefile: generate u-boot.dtb from dt-spl.dtb when using kernel dtb u-boot.bin doesn't affect u-boot.bin generation, but without this patch, it provides a wrong dtb file for user to debug when using kernel dtb. 'FORCE' is necessary to promise update u-boot.bin in every compilation. Change-Id: I53e6b73cb2a457bde222f8b9c7844f3877d63cdc Signed-off-by: Joseph Chen --- Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index dc812e2d97..e121dbd4d9 100644 --- a/Makefile +++ b/Makefile @@ -924,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 -- cgit v1.2.3 From ff86648dc8c70da71c443c99f66910424831d935 Mon Sep 17 00:00:00 2001 From: David Wu Date: Wed, 10 Apr 2019 09:30:55 +0800 Subject: net: Add rk1808 gmac support Change-Id: Iba89fc63dce6553beb266106f5f6287a2779032f Signed-off-by: David Wu --- drivers/net/gmac_rockchip.c | 82 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/drivers/net/gmac_rockchip.c b/drivers/net/gmac_rockchip.c index 1763089f71..9007e4cdac 100644 --- a/drivers/net/gmac_rockchip.c +++ b/drivers/net/gmac_rockchip.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -124,6 +125,40 @@ static int px30_gmac_fix_mac_speed(struct dw_eth_dev *priv) 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; @@ -366,6 +401,46 @@ static void px30_gmac_set_to_rmii(struct gmac_rockchip_platdata *pdata) 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; @@ -663,6 +738,11 @@ const struct rk_gmac_ops px30_gmac_ops = { .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, @@ -701,6 +781,8 @@ 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", -- cgit v1.2.3 From 4dad63273a8aa0989a94715320d2195b47a74d50 Mon Sep 17 00:00:00 2001 From: David Wu Date: Wed, 10 Apr 2019 09:32:15 +0800 Subject: config: rk1808: Enable GMAC config Change-Id: I168a1fd36101ef360461adfe0372d1ad490e41fc Signed-off-by: David Wu --- configs/rk1808_defconfig | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/configs/rk1808_defconfig b/configs/rk1808_defconfig index 0f722cb02d..834776a53d 100644 --- a/configs/rk1808_defconfig +++ b/configs/rk1808_defconfig @@ -38,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 @@ -57,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 -- cgit v1.2.3 From 860893596c908bffb1957f9c87cb8b7ce8ac090d Mon Sep 17 00:00:00 2001 From: David Wu Date: Wed, 10 Apr 2019 10:01:18 +0800 Subject: ARM: dts: rk1808-evb: Add gmac support at dts level Note that the gmac status is disabled. Change-Id: Ifac56c5d5c1cc10d5f2882fbfd1ef02d97299127 Signed-off-by: David Wu --- arch/arm/dts/rk1808-evb.dts | 23 +++++++++++++++++++++++ arch/arm/dts/rk1808.dtsi | 26 +++++++++++++------------- 2 files changed, 36 insertions(+), 13 deletions(-) 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 #include #include @@ -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>; }; -- cgit v1.2.3 From e7c691e7c7f2adc936d0d5670e3b1eb245fd5826 Mon Sep 17 00:00:00 2001 From: Simon Xue Date: Mon, 8 Apr 2019 18:28:53 +0800 Subject: watchdog: add support for Rockchip watchdog Change-Id: I6b50f79df12e86453f6defbbddba5f0cf2078d28 Signed-off-by: Simon Xue --- drivers/watchdog/Kconfig | 6 ++ drivers/watchdog/Makefile | 3 + drivers/watchdog/rockchip_wdt.c | 164 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 drivers/watchdog/rockchip_wdt.c 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 +#include +#include +#include +#include +#include + +#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, +}; -- cgit v1.2.3 From e65f23e90c404d909d0f5d47c829396c247a7986 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Tue, 9 Apr 2019 16:56:50 +0800 Subject: disk: rkparam: fix get disk part size error The disk part size is defined as number of blocks in partition rather than bytes.So delete "<< 9". Change-Id: I4428e5965c6456fcc69fb601d18a97fc48210617 Signed-off-by: Jason Zhu --- disk/part_rkparm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); -- cgit v1.2.3 From 2bbbd780f81ba50df48c3df0b7dec9e1827adf12 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 10 Apr 2019 14:12:04 +0800 Subject: tools: rockchip: loaderimage: print file size with KB load addr is 0x600000! pack input ./u-boot.bin pack file size: 484551(473 KB) crc = 0xfef42a0e uboot version: U-Boot 2017.09-02804-ge3e39ee-dirty (Apr 10 2019 - 14:11:39) Change-Id: If8fbdd943e328db41523ded47deeedfe8c6bde0e Signed-off-by: Joseph Chen --- tools/rockchip/loaderimage.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); -- cgit v1.2.3 From 45c2a034cd1ef3d6670aa94d37bb0ed75ede2b20 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 11 Apr 2019 11:56:22 +0800 Subject: tools: rockchip: boot/trust_merge: fix '--replace" missing append new path Change-Id: Icddfb2ce9c7ba6f4b4e558eb5833ba79d0e7b976 Signed-off-by: Joseph Chen --- tools/rockchip/boot_merger.c | 1 + tools/rockchip/trust_merger.c | 1 + 2 files changed, 2 insertions(+) diff --git a/tools/rockchip/boot_merger.c b/tools/rockchip/boot_merger.c index fd8916e2ba..9a23a7d30f 100644 --- a/tools/rockchip/boot_merger.c +++ b/tools/rockchip/boot_merger.c @@ -141,6 +141,7 @@ 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); } } diff --git a/tools/rockchip/trust_merger.c b/tools/rockchip/trust_merger.c index b481321973..fa89d3b5db 100644 --- a/tools/rockchip/trust_merger.c +++ b/tools/rockchip/trust_merger.c @@ -102,6 +102,7 @@ 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); } } -- cgit v1.2.3 From 9ad3008a7cac542073b79097dc7903fd2d5042b2 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 11 Apr 2019 14:23:01 +0800 Subject: tools: rockchip: boot/trust_merger: fix prefix append error - still append prefix if not match legacy prefix; - ignore append prefix for output; Change-Id: I1a8fc77ce73cbf169af49ce40ce3a0731861c617 Signed-off-by: Joseph Chen --- tools/rockchip/boot_merger.c | 5 ++++- tools/rockchip/trust_merger.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/rockchip/boot_merger.c b/tools/rockchip/boot_merger.c index 9a23a7d30f..923bdb75ba 100644 --- a/tools/rockchip/boot_merger.c +++ b/tools/rockchip/boot_merger.c @@ -143,6 +143,10 @@ static inline void fixPath(char *path) *start = '\0'; strcat(path, gNewPath); strcat(path, tmp); + } else { + strcpy(tmp, path); + strcpy(path, gNewPath); + strcat(path, tmp); } } } @@ -309,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/trust_merger.c b/tools/rockchip/trust_merger.c index fa89d3b5db..81e4da8a9b 100644 --- a/tools/rockchip/trust_merger.c +++ b/tools/rockchip/trust_merger.c @@ -104,6 +104,10 @@ static inline void fixPath(char *path) *start = '\0'; strcat(path, gNewPath); strcat(path, tmp); + } else { + strcpy(tmp, path); + strcpy(path, gNewPath); + strcat(path, tmp); } } } @@ -211,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; -- cgit v1.2.3 From f089d907dee8c0ceb2394ba1cdca43cc3cd8d90d Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 10 Apr 2019 13:05:28 +0800 Subject: make.sh: add max limit size check before packing uboot.img The uboot.img header is 2KB size. Change-Id: Ia99b71740423a5809233a3401f5a8698ae463749 Signed-off-by: Joseph Chen --- make.sh | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/make.sh b/make.sh index 98b0a00b9c..b2e50ecca6 100755 --- a/make.sh +++ b/make.sh @@ -504,8 +504,24 @@ 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'` -- cgit v1.2.3 From 0436a29d64ac791fefc764fadc7e64ba16bb6b25 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Thu, 11 Apr 2019 09:42:58 +0800 Subject: make.sh: use "${RKCHIP_LOADER}MINIALL*.ini" to match ini files clean: use variant "ini" for default MINIALL.ini path Change-Id: Ia1583a915ebbbc4ec5299b9ef6d81b04592bd04b Signed-off-by: Joseph Chen --- make.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/make.sh b/make.sh index b2e50ecca6..da072205b9 100755 --- a/make.sh +++ b/make.sh @@ -543,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 @@ -562,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 ./ -- cgit v1.2.3