From 9df731a176aab8e03b984b681b1bea01ccff6644 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 06 Nov 2023 07:23:06 +0000 Subject: [PATCH] rk3568 rt uboot init --- u-boot/lib/avb/libavb_user/avb_ops_user.c | 147 ++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 126 insertions(+), 21 deletions(-) diff --git a/u-boot/lib/avb/libavb_user/avb_ops_user.c b/u-boot/lib/avb/libavb_user/avb_ops_user.c index f7b2ac7..18c0c1f 100644 --- a/u-boot/lib/avb/libavb_user/avb_ops_user.c +++ b/u-boot/lib/avb/libavb_user/avb_ops_user.c @@ -81,10 +81,9 @@ return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; } - if (part_get_info_by_name(dev_desc, partition, &part_info) < 0) { - printf("Could not find \"%s\" partition\n", partition); + if (part_get_info_by_name(dev_desc, partition, &part_info) < 0) return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; - } + *out_size_in_bytes = (part_info.size) * 512; return AVB_IO_RESULT_OK; } @@ -281,6 +280,7 @@ { if (out_is_unlocked) { #ifdef CONFIG_OPTEE_CLIENT + uint8_t vboot_flag = 0; int ret; ret = trusty_read_lock_state((uint8_t *)out_is_unlocked); @@ -291,7 +291,16 @@ case TEE_ERROR_GENERIC: case TEE_ERROR_NO_DATA: case TEE_ERROR_ITEM_NOT_FOUND: - *out_is_unlocked = 1; + if (trusty_read_vbootkey_enable_flag(&vboot_flag)) { + printf("Can't read vboot flag\n"); + return AVB_IO_RESULT_ERROR_IO; + } + + if (vboot_flag) + *out_is_unlocked = 0; + else + *out_is_unlocked = 1; + if (trusty_write_lock_state(*out_is_unlocked)) { printf("%s: init lock state error\n", __FILE__); ret = AVB_IO_RESULT_ERROR_IO; @@ -429,30 +438,111 @@ size_t* out_num_bytes_preloaded, int allow_verification_error) { + struct preloaded_partition *preload_info = NULL; + struct AvbOpsData *data = ops->user_data; struct blk_desc *dev_desc; + disk_partition_t part_info; ulong load_addr; - int ret; + AvbIOResult ret; + int full_preload = 0; - /* no need go further */ - if (!allow_verification_error) - return AVB_IO_RESULT_OK; - - printf("get image from preloaded partition...\n"); dev_desc = rockchip_get_bootdev(); if (!dev_desc) - return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; + return AVB_IO_RESULT_ERROR_IO; - load_addr = env_get_ulong("kernel_addr_r", 16, 0); - if (!load_addr) - return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE; + if (part_get_info_by_name(dev_desc, partition, &part_info) < 0) { + printf("Could not find \"%s\" partition\n", partition); + return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; + } - ret = android_image_load_by_partname(dev_desc, partition, &load_addr); - if (!ret) { - *out_pointer = (u8 *)load_addr; - *out_num_bytes_preloaded = num_bytes; /* return what it expects */ + if (!allow_verification_error) { + if (!strncmp(partition, ANDROID_PARTITION_BOOT, 4) || + !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8)) + preload_info = &data->boot; + else if (!strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11)) + preload_info = &data->vendor_boot; + else if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9)) + preload_info = &data->init_boot; + else if (!strncmp(partition, ANDROID_PARTITION_RESOURCE, 8)) + preload_info = &data->resource; + + if (!preload_info) { + printf("Error: unknown full load partition '%s'\n", partition); + return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; + } + + printf("preloaded(s): %sfull image from '%s' at 0x%08lx - 0x%08lx\n", + preload_info->size ? "pre-" : "", partition, + (ulong)preload_info->addr, + (ulong)preload_info->addr + num_bytes); + + /* If the partition hasn't yet been preloaded, do it now.*/ + if (preload_info->size == 0) { + ret = ops->read_from_partition(ops, partition, + 0, num_bytes, + preload_info->addr, + &preload_info->size); + if (ret != AVB_IO_RESULT_OK) + return ret; + } + *out_pointer = preload_info->addr; + *out_num_bytes_preloaded = preload_info->size; ret = AVB_IO_RESULT_OK; } else { - ret = AVB_IO_RESULT_ERROR_IO; + if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9) || + !strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11) || + !strncmp(partition, ANDROID_PARTITION_BOOT, 4) || + !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8) || + !strncmp(partition, ANDROID_PARTITION_RESOURCE, 8)) { + /* If already full preloaded, just use it */ + if (!strncmp(partition, ANDROID_PARTITION_BOOT, 4) || + !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8)) { + preload_info = &data->boot; + if (preload_info->size) { + *out_pointer = preload_info->addr; + *out_num_bytes_preloaded = num_bytes; + full_preload = 1; + } + } + printf("preloaded: %s image from '%s\n", + full_preload ? "pre-full" : "distribute", partition); + } else { + printf("Error: unknown preloaded partition '%s'\n", partition); + return AVB_IO_RESULT_ERROR_OOM; + } + + /* + * Already preloaded during boot/recovery loading, + * here we just return a dummy buffer. + */ + if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9) || + !strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11) || + !strncmp(partition, ANDROID_PARTITION_RESOURCE, 8)) { + *out_pointer = (u8 *)avb_malloc(ARCH_DMA_MINALIGN); + *out_num_bytes_preloaded = num_bytes; /* return what it expects */ + return AVB_IO_RESULT_OK; + } + + /* If already full preloaded, there is nothing to do and just return */ + if (full_preload) + return AVB_IO_RESULT_OK; + + /* + * only boot/recovery partition can reach here + * and init/vendor_boot are loaded at this round. + */ + load_addr = env_get_ulong("kernel_addr_r", 16, 0); + if (!load_addr) + return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE; + + ret = android_image_load_by_partname(dev_desc, partition, &load_addr); + if (!ret) { + *out_pointer = (u8 *)load_addr; + *out_num_bytes_preloaded = num_bytes; /* return what it expects */ + ret = AVB_IO_RESULT_OK; + } else { + ret = AVB_IO_RESULT_ERROR_IO; + } } return ret; @@ -489,7 +579,8 @@ AvbOps *avb_ops_user_new(void) { - AvbOps *ops; + AvbOps *ops = NULL; + struct AvbOpsData *ops_data = NULL; ops = calloc(1, sizeof(AvbOps)); if (!ops) { @@ -510,8 +601,20 @@ free(ops); goto out; } + + ops_data = calloc(1, sizeof(struct AvbOpsData)); + if (!ops_data) { + printf("Error allocating memory for AvbOpsData.\n"); + free(ops->atx_ops); + free(ops->ab_ops); + free(ops); + goto out; + } + ops->ab_ops->ops = ops; ops->atx_ops->ops = ops; + ops_data->ops = ops; + ops->user_data = ops_data; ops->read_from_partition = read_from_partition; ops->write_to_partition = write_to_partition; @@ -533,12 +636,14 @@ ops->atx_ops->set_key_version = avb_set_key_version; ops->atx_ops->get_random = rk_get_random; -out: return ops; +out: + return NULL; } void avb_ops_user_free(AvbOps *ops) { + free(ops->user_data); free(ops->ab_ops); free(ops->atx_ops); free(ops); -- Gitblit v1.6.2