X-Git-Url: https://git.kernelconcepts.de/?a=blobdiff_plain;f=common%2Fcmd_mmc.c;h=eb0976b4d8b1e01973db70368d050a53ddb8a845;hb=c2e398d17bc691a0db4bda95b8e8ece275619592;hp=afa87fe2a78b956195a1bfbc50fcc67a700e4f78;hpb=8cc32b9f5c53d01a3acdf5e5b4c9a8931eb68d58;p=karo-tx-uboot.git diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c index afa87fe2a7..eb0976b4d8 100644 --- a/common/cmd_mmc.c +++ b/common/cmd_mmc.c @@ -85,8 +85,12 @@ static void print_mmcinfo(struct mmc *mmc) printf("Tran Speed: %d\n", mmc->tran_speed); printf("Rd Block Len: %d\n", mmc->read_bl_len); - printf("%s version %d.%d\n", IS_SD(mmc) ? "SD" : "MMC", - (mmc->version >> 8) & 0xf, mmc->version & 0xff); + printf("%s version %d.%d", IS_SD(mmc) ? "SD" : "MMC", + EXTRACT_SDMMC_MAJOR_VERSION(mmc->version), + EXTRACT_SDMMC_MINOR_VERSION(mmc->version)); + if (EXTRACT_SDMMC_CHANGE_VERSION(mmc->version) != 0) + printf(".%d", EXTRACT_SDMMC_CHANGE_VERSION(mmc->version)); + printf("\n"); printf("High Capacity: %s\n", mmc->high_capacity ? "Yes" : "No"); puts("Capacity: "); @@ -657,25 +661,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 +717,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 +766,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 +807,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 +819,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 +829,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 +861,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) {