From: Andrii Chepurnyi <andrii.chepurny...@gmail.com>

From: Andrii Chepurnyi <andrii_chepur...@epam.com>

Originally, avb implementation relay on mmc block devices.
The interface parameter will give the ability to use avb with
various block devices by choosing the exact interface type.
By default (if no interface parameter is provided) mmc interface
will be used.

Signed-off-by: Andrii Chepurnyi <andrii_chepur...@epam.com>
---
 cmd/avb.c            | 13 +++++--------
 common/avb_verify.c  | 28 ++++++++++------------------
 doc/android/avb2.rst |  2 +-
 include/avb_verify.h | 11 ++++++++++-
 4 files changed, 26 insertions(+), 28 deletions(-)

diff --git a/cmd/avb.c b/cmd/avb.c
index 783f51b816..6fdbdc708f 100644
--- a/cmd/avb.c
+++ b/cmd/avb.c
@@ -17,17 +17,14 @@ static struct AvbOps *avb_ops;
 
 int do_avb_init(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
-       unsigned long mmc_dev;
-
-       if (argc != 2)
+       if (argc != 2 && argc != 3)
                return CMD_RET_USAGE;
 
-       mmc_dev = hextoul(argv[1], NULL);
-
        if (avb_ops)
                avb_ops_free(avb_ops);
 
-       avb_ops = avb_ops_alloc(mmc_dev);
+       avb_ops = avb_ops_alloc(argv[1], (argc == 3) ? argv[2] : "mmc");
+
        if (avb_ops)
                return CMD_RET_SUCCESS;
 
@@ -419,7 +416,7 @@ int do_avb_write_pvalue(struct cmd_tbl *cmdtp, int flag, 
int argc,
 }
 
 static struct cmd_tbl cmd_avb[] = {
-       U_BOOT_CMD_MKENT(init, 2, 0, do_avb_init, "", ""),
+       U_BOOT_CMD_MKENT(init, 3, 0, do_avb_init, "", ""),
        U_BOOT_CMD_MKENT(read_rb, 2, 0, do_avb_read_rb, "", ""),
        U_BOOT_CMD_MKENT(write_rb, 3, 0, do_avb_write_rb, "", ""),
        U_BOOT_CMD_MKENT(is_unlocked, 1, 0, do_avb_is_unlocked, "", ""),
@@ -455,7 +452,7 @@ static int do_avb(struct cmd_tbl *cmdtp, int flag, int 
argc, char *const argv[])
 U_BOOT_CMD(
        avb, 29, 0, do_avb,
        "Provides commands for testing Android Verified Boot 2.0 functionality",
-       "init <dev> - initialize avb2 for <dev>\n"
+       "init <dev> [<interface>] - initialize avb2 for <dev> [<interface>]\n"
        "avb read_rb <num> - read rollback index at location <num>\n"
        "avb write_rb <num> <rb> - write rollback index <rb> to <num>\n"
        "avb is_unlocked - returns unlock status of the device\n"
diff --git a/common/avb_verify.c b/common/avb_verify.c
index 0520a71455..e086dc6760 100644
--- a/common/avb_verify.c
+++ b/common/avb_verify.c
@@ -338,7 +338,6 @@ static struct mmc_part *get_partition(AvbOps *ops, const 
char *partition)
 {
        int ret;
        u8 dev_num;
-       int part_num = 0;
        struct mmc_part *part;
        struct blk_desc *mmc_blk;
 
@@ -347,22 +346,8 @@ static struct mmc_part *get_partition(AvbOps *ops, const 
char *partition)
                return NULL;
 
        dev_num = get_boot_device(ops);
-       part->mmc = find_mmc_device(dev_num);
-       if (!part->mmc) {
-               printf("No MMC device at slot %x\n", dev_num);
-               goto err;
-       }
-
-       if (mmc_init(part->mmc)) {
-               printf("MMC initialization failed\n");
-               goto err;
-       }
+       mmc_blk = get_blk(ops);
 
-       ret = mmc_switch_part(part->mmc, part_num);
-       if (ret)
-               goto err;
-
-       mmc_blk = mmc_get_blk_desc(part->mmc);
        if (!mmc_blk) {
                printf("Error - failed to obtain block descriptor\n");
                goto err;
@@ -976,7 +961,8 @@ free_name:
  * AVB2.0 AvbOps alloc/initialisation/free
  * ============================================================================
  */
-AvbOps *avb_ops_alloc(int boot_device)
+
+AvbOps *avb_ops_alloc(const char *boot_device, const char *interface)
 {
        struct AvbOpsData *ops_data;
 
@@ -999,7 +985,13 @@ AvbOps *avb_ops_alloc(int boot_device)
        ops_data->ops.read_persistent_value = read_persistent_value;
 #endif
        ops_data->ops.get_size_of_partition = get_size_of_partition;
-       ops_data->mmc_dev = boot_device;
+       ops_data->mmc_dev = simple_strtoul(boot_device, NULL, 16);
+       ops_data->blk = NULL;
+       if (interface && (blk_get_device_by_str(interface, boot_device, 
&ops_data->blk) < 0)) {
+               printf("Error - failed to obtain block descriptor for devce=%s 
if=%s\n",
+                      boot_device, interface);
+               return NULL;
+       }
 
        return &ops_data->ops;
 }
diff --git a/doc/android/avb2.rst b/doc/android/avb2.rst
index a072119574..8fa54338fd 100644
--- a/doc/android/avb2.rst
+++ b/doc/android/avb2.rst
@@ -38,7 +38,7 @@ AVB 2.0 U-Boot shell commands
 Provides CLI interface to invoke AVB 2.0 verification + misc. commands for
 different testing purposes::
 
-    avb init <dev> - initialize avb 2.0 for <dev>
+    avb init <dev> [<interface>] - initialize avb2 for <dev> [<interface>]
     avb verify - run verification process using hash data from vbmeta structure
     avb read_rb <num> - read rollback index at location <num>
     avb write_rb <num> <rb> - write rollback index <rb> to <num>
diff --git a/include/avb_verify.h b/include/avb_verify.h
index 1e787ba666..ff70cb26f8 100644
--- a/include/avb_verify.h
+++ b/include/avb_verify.h
@@ -32,6 +32,7 @@ struct AvbOpsData {
        struct udevice *tee;
        u32 session;
 #endif
+       struct blk_desc *blk;
 };
 
 struct mmc_part {
@@ -46,7 +47,7 @@ enum mmc_io_type {
        IO_WRITE
 };
 
-AvbOps *avb_ops_alloc(int boot_device);
+AvbOps *avb_ops_alloc(const char *boot_device, const char *interface);
 void avb_ops_free(AvbOps *ops);
 
 char *avb_set_state(AvbOps *ops, enum avb_boot_state boot_state);
@@ -98,4 +99,12 @@ static inline int get_boot_device(AvbOps *ops)
        return -1;
 }
 
+static inline struct blk_desc *get_blk(AvbOps *ops)
+{
+       if (ops && ops->user_data)
+               return ((struct AvbOpsData *)ops->user_data)->blk;
+
+       return NULL;
+}
+
 #endif /* _AVB_VERIFY_H */
-- 
2.25.1

Reply via email to