X-Git-Url: https://git.kernelconcepts.de/?p=karo-tx-uboot.git;a=blobdiff_plain;f=common%2Fcmd_mmc.c;h=f9378de44a6cf9bd4020f5c9016353f0b8c48ec2;hp=afa87fe2a78b956195a1bfbc50fcc67a700e4f78;hb=2bae9961d149abd7b5142e9a39821d324fcb892a;hpb=8cc32b9f5c53d01a3acdf5e5b4c9a8931eb68d58 diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c index afa87fe2a7..f9378de44a 100644 --- a/common/cmd_mmc.c +++ b/common/cmd_mmc.c @@ -657,25 +657,54 @@ static int do_mmc_bootbus(cmd_tbl_t *cmdtp, int flag, int dev; struct mmc *mmc; u8 width, reset, mode; + int ret; + char *end; if (argc != 5) return CMD_RET_USAGE; - dev = simple_strtoul(argv[1], NULL, 10); - width = simple_strtoul(argv[2], NULL, 10); - reset = simple_strtoul(argv[3], NULL, 10); - mode = simple_strtoul(argv[4], NULL, 10); + dev = simple_strtoul(argv[1], &end, 10); + if (dev < 0 || dev >= get_mmc_dev_count() || *end != '\0') { + printf("Invalid mmc device '%s'; should be [0..%u]\n", + argv[1], get_mmc_dev_count() - 1); + return CMD_RET_FAILURE; + } + + width = simple_strtoul(argv[2], &end, 10); + if (width > 2 || *end != '\0') { + printf("Invalid boot_bus_width parameter '%s'; expected [0..2]\n", + argv[2]); + return CMD_RET_FAILURE; + } + + reset = simple_strtoul(argv[3], &end, 10); + if (reset > 1 || *end != '\0') { + printf("Invalid reset_boot_bus_width parameter '%s'; expected 0 or 1\n", + argv[3]); + return CMD_RET_FAILURE; + } + mode = simple_strtoul(argv[4], &end, 10); + if (mode > 2 || *end != '\0') { + printf("Invalid boot_mode parameter '%s'; expected [0..2]\n", + argv[4]); + return CMD_RET_FAILURE; + } mmc = init_mmc_device(dev, false); - if (!mmc) + if (!mmc) { + printf("Failed to init MMC device %d\n", dev); return CMD_RET_FAILURE; + } if (IS_SD(mmc)) { puts("BOOT_BUS_WIDTH only exists on eMMC\n"); return CMD_RET_FAILURE; } - return mmc_set_boot_bus_width(mmc, width, reset, mode); + ret = mmc_set_boot_bus_width(mmc, width, reset, mode); + if (ret) + printf("Setting boot bus width failed: %d\n", ret); + return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS; } static int do_mmc_boot_resize(cmd_tbl_t *cmdtp, int flag, @@ -684,24 +713,41 @@ static int do_mmc_boot_resize(cmd_tbl_t *cmdtp, int flag, int dev; struct mmc *mmc; u32 bootsize, rpmbsize; + int ret; + char *end; if (argc != 4) return CMD_RET_USAGE; - dev = simple_strtoul(argv[1], NULL, 10); - bootsize = simple_strtoul(argv[2], NULL, 10); - rpmbsize = simple_strtoul(argv[3], NULL, 10); + + dev = simple_strtoul(argv[1], &end, 10); + if (dev < 0 || dev >= get_mmc_dev_count() || *end != '\0') { + printf("Invalid mmc device '%s'; should be [0..%u]\n", + argv[1], get_mmc_dev_count() - 1); + return CMD_RET_FAILURE; + } + + bootsize = simple_strtoul(argv[2], &end, 10); + if (bootsize > 64 || *end != '\0') { + return CMD_RET_FAILURE; + } + + rpmbsize = simple_strtoul(argv[3], &end, 10); + if (rpmbsize > 64 || *end != '\0') { + return CMD_RET_FAILURE; + } mmc = init_mmc_device(dev, false); if (!mmc) return CMD_RET_FAILURE; if (IS_SD(mmc)) { - printf("It is not a EMMC device\n"); + printf("mmc device %d is not an EMMC device\n", dev); return CMD_RET_FAILURE; } - if (mmc_boot_partition_size_change(mmc, bootsize, rpmbsize)) { - printf("EMMC boot partition Size change Failed.\n"); + ret = mmc_boot_partition_size_change(mmc, bootsize, rpmbsize); + if (ret) { + printf("EMMC boot partition size change failed: %d\n", ret); return CMD_RET_FAILURE; } @@ -716,14 +762,36 @@ static int do_mmc_partconf(cmd_tbl_t *cmdtp, int flag, int dev; struct mmc *mmc; u8 ack, part_num, access; + char *end; + int ret; if (argc != 5) return CMD_RET_USAGE; - dev = simple_strtoul(argv[1], NULL, 10); - ack = simple_strtoul(argv[2], NULL, 10); - part_num = simple_strtoul(argv[3], NULL, 10); - access = simple_strtoul(argv[4], NULL, 10); + dev = simple_strtoul(argv[1], &end, 10); + if (dev < 0 || dev >= get_mmc_dev_count() || *end != '\0') { + printf("Invalid mmc device '%s'; should be [0..%u]\n", + argv[1], get_mmc_dev_count() - 1); + return CMD_RET_FAILURE; + } + + ack = simple_strtoul(argv[2], &end, 10); + if (ack < 0 || ack > 1 || *end != '\0') { + printf("Invalid boot_ack value: %s\n", argv[2]); + return CMD_RET_FAILURE; + } + + part_num = simple_strtoul(argv[3], &end, 10); + if (part_num < 0 || (part_num > 4 && part_num != 7) || *end != '\0') { + printf("Invalid part_num: %s\n", argv[3]); + return CMD_RET_FAILURE; + } + + access = simple_strtoul(argv[4], &end, 10); + if (access < 0 || access > 7 || *end != '\0') { + printf("Invalid access value: %s\n", argv[4]); + return CMD_RET_FAILURE; + } mmc = init_mmc_device(dev, false); if (!mmc) @@ -735,7 +803,10 @@ static int do_mmc_partconf(cmd_tbl_t *cmdtp, int flag, } /* acknowledge to be sent during boot operation */ - return mmc_set_part_conf(mmc, ack, part_num, access); + ret = mmc_set_part_conf(mmc, ack, part_num, access); + if (ret) + printf("partconf failed: %d\n", ret); + return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS; } static int do_mmc_rst_func(cmd_tbl_t *cmdtp, int flag, @@ -744,6 +815,7 @@ static int do_mmc_rst_func(cmd_tbl_t *cmdtp, int flag, int dev; struct mmc *mmc; u8 enable; + char *end; /* * Set the RST_n_ENABLE bit of RST_n_FUNCTION @@ -753,8 +825,14 @@ static int do_mmc_rst_func(cmd_tbl_t *cmdtp, int flag, if (argc != 3) return CMD_RET_USAGE; - dev = simple_strtoul(argv[1], NULL, 10); - enable = simple_strtoul(argv[2], NULL, 10); + dev = simple_strtoul(argv[1], &end, 10); + if (dev < 0 || dev >= get_mmc_dev_count() || *end != '\0') { + printf("Invalid mmc device '%s'; should be [0..%u]\n", + argv[1], get_mmc_dev_count() - 1); + return CMD_RET_FAILURE; + } + + enable = simple_strtoul(argv[2], &end, 10); if (enable > 2 || enable < 0) { puts("Invalid RST_n_ENABLE value\n"); @@ -779,11 +857,17 @@ static int do_mmc_setdsr(cmd_tbl_t *cmdtp, int flag, { struct mmc *mmc; u32 val; + char *end; int ret; if (argc != 2) return CMD_RET_USAGE; - val = simple_strtoul(argv[2], NULL, 16); + val = simple_strtoul(argv[2], &end, 16); + if (val > 0xffff || *end != '\0') { + printf("Invalid DSR value '%s'; expected hex number [0..ffff]\n", + argv[2]); + return CMD_RET_FAILURE; + } mmc = find_mmc_device(curr_device); if (!mmc) {