Hello community, here is the log from the commit of package mmc-utils for openSUSE:Factory checked in at 2016-03-16 10:34:34 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/mmc-utils (Old) and /work/SRC/openSUSE:Factory/.mmc-utils.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "mmc-utils" Changes: -------- --- /work/SRC/openSUSE:Factory/mmc-utils/mmc-utils.changes 2016-03-07 13:24:21.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.mmc-utils.new/mmc-utils.changes 2016-03-16 10:34:35.000000000 +0100 @@ -1,0 +2,15 @@ +Wed Mar 09 16:42:06 UTC 2016 - mplus...@suse.com + +- Update to version 0.1~git.20160308: + + Fit usage to 80 cols + + fix building errors on Android + + mmc-utils: add check for max enhanced user area + + mmc-utils: add support to create gp partition + + mmc-utils: Add command to set the boot bus conditions + + mmc-utils: add ability to enable/disable optional eMMC cache + + mmc_utils: gp create: only allow partition [1-4] to be selected + + mmc_utils: doc: add man-page + + mmc-utils: Merge the lsmmc tool into mmc-utils + + mmc_utils: add ffu support + +------------------------------------------------------------------- Old: ---- mmc-utils-0.1~git.20160223.tar.xz New: ---- mmc-utils-0.1~git.20160308.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ mmc-utils.spec ++++++ --- /var/tmp/diff_new_pack.I2ChmN/_old 2016-03-16 10:34:36.000000000 +0100 +++ /var/tmp/diff_new_pack.I2ChmN/_new 2016-03-16 10:34:36.000000000 +0100 @@ -17,7 +17,7 @@ Name: mmc-utils -Version: 0.1~git.20160223 +Version: 0.1~git.20160308 Release: 0 Summary: Tools for MMC/SD devices License: GPL-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.I2ChmN/_old 2016-03-16 10:34:36.000000000 +0100 +++ /var/tmp/diff_new_pack.I2ChmN/_new 2016-03-16 10:34:36.000000000 +0100 @@ -3,6 +3,7 @@ <param name="url">git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc-utils.git</param> <param name="scm">git</param> <param name="filename">mmc-utils</param> + <param name="changesgenerate">enable</param> <param name="versionformat">0.1~git.%ad</param> </service> <service mode="localonly" name="recompress"> ++++++ do_not_use_asm_generic.patch ++++++ --- /var/tmp/diff_new_pack.I2ChmN/_old 2016-03-16 10:34:36.000000000 +0100 +++ /var/tmp/diff_new_pack.I2ChmN/_new 2016-03-16 10:34:36.000000000 +0100 @@ -9,12 +9,12 @@ mmc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -Index: mmc-utils-20151118/mmc.h +Index: mmc-utils-0.1~git.20160308/mmc.h =================================================================== ---- mmc-utils-20151118.orig/mmc.h -+++ mmc-utils-20151118/mmc.h -@@ -14,7 +14,7 @@ - * Boston, MA 021110-1307, USA. +--- mmc-utils-0.1~git.20160308.orig/mmc.h ++++ mmc-utils-0.1~git.20160308/mmc.h +@@ -17,7 +17,7 @@ + * those modifications are Copyright (c) 2016 SanDisk Corp. */ -#include <asm-generic/int-ll64.h> ++++++ mmc-utils-0.1~git.20160223.tar.xz -> mmc-utils-0.1~git.20160308.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mmc-utils-0.1~git.20160223/mmc.c new/mmc-utils-0.1~git.20160308/mmc.c --- old/mmc-utils-0.1~git.20160223/mmc.c 2016-03-01 17:38:32.000000000 +0100 +++ new/mmc-utils-0.1~git.20160308/mmc.c 2016-03-09 17:42:06.000000000 +0100 @@ -13,6 +13,9 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 021110-1307, USA. * + * Modified to add field firmware update support, + * those modifications are Copyright (c) 2016 SanDisk Corp. + * * (This code is based on btrfs-progs/btrfs.c.) */ @@ -193,6 +196,11 @@ "The device path should specify the scr file directory.", NULL }, + { do_ffu, -2, + "ffu", "<image name> <device>\n" + "Run Field Firmware Update with <image name> on <device>.\n", + NULL + }, { 0, 0, 0, 0 } }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mmc-utils-0.1~git.20160223/mmc.h new/mmc-utils-0.1~git.20160308/mmc.h --- old/mmc-utils-0.1~git.20160223/mmc.h 2016-03-01 17:38:32.000000000 +0100 +++ new/mmc-utils-0.1~git.20160308/mmc.h 2016-03-09 17:42:06.000000000 +0100 @@ -12,6 +12,9 @@ * License along with this program; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 021110-1307, USA. + * + * Modified to add field firmware update support, + * those modifications are Copyright (c) 2016 SanDisk Corp. */ #include <asm-generic/int-ll64.h> @@ -34,6 +37,7 @@ #define R1_SWITCH_ERROR (1 << 7) /* sx, c */ #define MMC_SWITCH_MODE_WRITE_BYTE 0x03 /* Set target to value */ #define MMC_READ_MULTIPLE_BLOCK 18 /* adtc [31:0] data addr R1 */ +#define MMC_WRITE_BLOCK 24 /* adtc [31:0] data addr R1 */ #define MMC_WRITE_MULTIPLE_BLOCK 25 /* adtc R1 */ /* @@ -42,6 +46,17 @@ #define EXT_CSD_S_CMD_SET 504 #define EXT_CSD_HPI_FEATURE 503 #define EXT_CSD_BKOPS_SUPPORT 502 /* RO */ +#define EXT_CSD_SUPPORTED_MODES 493 /* RO */ +#define EXT_CSD_FFU_FEATURES 492 /* RO */ +#define EXT_CSD_FFU_ARG_3 490 /* RO */ +#define EXT_CSD_FFU_ARG_2 489 /* RO */ +#define EXT_CSD_FFU_ARG_1 488 /* RO */ +#define EXT_CSD_FFU_ARG_0 487 /* RO */ +#define EXT_CSD_NUM_OF_FW_SEC_PROG_3 305 /* RO */ +#define EXT_CSD_NUM_OF_FW_SEC_PROG_2 304 /* RO */ +#define EXT_CSD_NUM_OF_FW_SEC_PROG_1 303 /* RO */ +#define EXT_CSD_NUM_OF_FW_SEC_PROG_0 302 /* RO */ +#define EXT_CSD_FIRMWARE_VERSION 254 /* RO */ #define EXT_CSD_CACHE_SIZE_3 252 #define EXT_CSD_CACHE_SIZE_2 251 #define EXT_CSD_CACHE_SIZE_1 250 @@ -58,6 +73,7 @@ #define EXT_CSD_BOOT_BUS_CONDITIONS 177 #define EXT_CSD_ERASE_GROUP_DEF 175 #define EXT_CSD_BOOT_WP 173 +#define EXT_CSD_FW_CONFIG 169 /* R/W */ #define EXT_CSD_WR_REL_SET 167 #define EXT_CSD_WR_REL_PARAM 166 #define EXT_CSD_SANITIZE_START 165 @@ -94,6 +110,9 @@ #define EXT_CSD_EXT_PARTITIONS_ATTRIBUTE_1 53 #define EXT_CSD_EXT_PARTITIONS_ATTRIBUTE_0 52 #define EXT_CSD_CACHE_CTRL 33 +#define EXT_CSD_MODE_CONFIG 30 +#define EXT_CSD_MODE_OPERATION_CODES 29 /* W */ +#define EXT_CSD_FFU_STATUS 26 /* R */ /* * WR_REL_PARAM field definitions @@ -109,6 +128,11 @@ /* * EXT_CSD field definitions */ +#define EXT_CSD_FFU_INSTALL (0x01) +#define EXT_CSD_FFU_MODE (0x01) +#define EXT_CSD_NORMAL_MODE (0x00) +#define EXT_CSD_FFU (1<<0) +#define EXT_CSD_UPDATE_DISABLE (1<<0) #define EXT_CSD_HPI_SUPP (1<<0) #define EXT_CSD_HPI_IMPL (1<<1) #define EXT_CSD_CMD_SET_NORMAL (1<<0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mmc-utils-0.1~git.20160223/mmc_cmds.c new/mmc-utils-0.1~git.20160308/mmc_cmds.c --- old/mmc-utils-0.1~git.20160223/mmc_cmds.c 2016-03-01 17:38:32.000000000 +0100 +++ new/mmc-utils-0.1~git.20160308/mmc_cmds.c 2016-03-09 17:42:06.000000000 +0100 @@ -12,6 +12,9 @@ * License along with this program; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 021110-1307, USA. + * + * Modified to add field firmware update support, + * those modifications are Copyright (c) 2016 SanDisk Corp. */ #include <stdio.h> @@ -1017,6 +1020,9 @@ ext_csd_rev = ext_csd[EXT_CSD_REV]; switch (ext_csd_rev) { + case 8: + str = "5.1"; + break; case 7: str = "5.0"; break; @@ -1430,6 +1436,10 @@ /*Reserved [31:0] */ } + if (ext_csd_rev >= 7) { + printf("eMMC Firmware Version: %s\n", + (char*)&ext_csd[EXT_CSD_FIRMWARE_VERSION]); + } out_free: return ret; } @@ -2032,3 +2042,224 @@ { return do_cache_ctrl(0, nargs, argv); } + +int do_ffu(int nargs, char **argv) +{ +#ifndef MMC_IOC_MULTI_CMD + fprintf(stderr, "mmc-utils has been compiled without MMC_IOC_MULTI_CMD" + " support, needed by FFU.\n"); + exit(1); +#else + int dev_fd, img_fd; + int sect_done = 0, retry = 3, ret = -EINVAL; + unsigned int sect_size; + __u8 ext_csd[512]; + __u8 *buf; + __u32 arg; + off_t fw_size; + ssize_t chunk_size; + char *device; + struct mmc_ioc_multi_cmd *multi_cmd; + + CHECK(nargs != 3, "Usage: ffu <image name> </path/to/mmcblkX> \n", + exit(1)); + + device = argv[2]; + dev_fd = open(device, O_RDWR); + if (dev_fd < 0) { + perror("device open failed"); + exit(1); + } + img_fd = open(argv[1], O_RDONLY); + if (img_fd < 0) { + perror("image open failed"); + close(dev_fd); + exit(1); + } + + buf = malloc(512); + multi_cmd = calloc(1, sizeof(struct mmc_ioc_multi_cmd) + + 3 * sizeof(struct mmc_ioc_cmd)); + if (!buf || !multi_cmd) { + perror("failed to allocate memory"); + goto out; + } + + ret = read_extcsd(dev_fd, ext_csd); + if (ret) { + fprintf(stderr, "Could not read EXT_CSD from %s\n", device); + goto out; + } + + if (ext_csd[EXT_CSD_REV] < EXT_CSD_REV_V5_0) { + fprintf(stderr, + "The FFU feature is only available on devices >= " + "MMC 5.0, not supported in %s\n", device); + goto out; + } + + if (!(ext_csd[EXT_CSD_SUPPORTED_MODES] & EXT_CSD_FFU)) { + fprintf(stderr, "FFU is not supported in %s\n", device); + goto out; + } + + if (ext_csd[EXT_CSD_FW_CONFIG] & EXT_CSD_UPDATE_DISABLE) { + fprintf(stderr, "Firmware update was disabled in %s\n", device); + goto out; + } + + fw_size = lseek(img_fd, 0, SEEK_END); + + if (fw_size == 0) { + fprintf(stderr, "Firmware image is empty"); + goto out; + } + + sect_size = (ext_csd[EXT_CSD_DATA_SECTOR_SIZE] == 0) ? 512 : 4096; + if (fw_size % sect_size) { + fprintf(stderr, "Firmware data size (%jd) is not aligned!\n", (intmax_t)fw_size); + goto out; + } + + /* set CMD ARG */ + arg = ext_csd[EXT_CSD_FFU_ARG_0] | + ext_csd[EXT_CSD_FFU_ARG_1] << 8 | + ext_csd[EXT_CSD_FFU_ARG_2] << 16 | + ext_csd[EXT_CSD_FFU_ARG_3] << 24; + + /* prepare multi_cmd to be sent */ + multi_cmd->num_of_cmds = 3; + + /* put device into ffu mode */ + multi_cmd->cmds[0].opcode = MMC_SWITCH; + multi_cmd->cmds[0].arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | + (EXT_CSD_MODE_CONFIG << 16) | + (EXT_CSD_FFU_MODE << 8) | + EXT_CSD_CMD_SET_NORMAL; + multi_cmd->cmds[0].flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; + multi_cmd->cmds[0].write_flag = 1; + + /* send image chunk */ + multi_cmd->cmds[1].opcode = MMC_WRITE_BLOCK; + multi_cmd->cmds[1].blksz = sect_size; + multi_cmd->cmds[1].blocks = 1; + multi_cmd->cmds[1].arg = arg; + multi_cmd->cmds[1].flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC; + multi_cmd->cmds[1].write_flag = 1; + mmc_ioc_cmd_set_data(multi_cmd->cmds[1], buf); + + /* return device into normal mode */ + multi_cmd->cmds[2].opcode = MMC_SWITCH; + multi_cmd->cmds[2].arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | + (EXT_CSD_MODE_CONFIG << 16) | + (EXT_CSD_NORMAL_MODE << 8) | + EXT_CSD_CMD_SET_NORMAL; + multi_cmd->cmds[2].flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; + multi_cmd->cmds[2].write_flag = 1; + +do_retry: + /* read firmware chunk */ + lseek(img_fd, 0, SEEK_SET); + chunk_size = read(img_fd, buf, 512); + + while (chunk_size > 0) { + /* send ioctl with multi-cmd */ + ret = ioctl(dev_fd, MMC_IOC_MULTI_CMD, multi_cmd); + + if (ret) { + perror("Multi-cmd ioctl"); + /* In case multi-cmd ioctl failed before exiting from ffu mode */ + ioctl(dev_fd, MMC_IOC_CMD, &multi_cmd->cmds[2]); + goto out; + } + + ret = read_extcsd(dev_fd, ext_csd); + if (ret) { + fprintf(stderr, "Could not read EXT_CSD from %s\n", device); + goto out; + } + + /* Test if we need to restart the download */ + sect_done = ext_csd[EXT_CSD_NUM_OF_FW_SEC_PROG_0] | + ext_csd[EXT_CSD_NUM_OF_FW_SEC_PROG_1] << 8 | + ext_csd[EXT_CSD_NUM_OF_FW_SEC_PROG_2] << 16 | + ext_csd[EXT_CSD_NUM_OF_FW_SEC_PROG_3] << 24; + /* By spec, host should re-start download from the first sector if sect_done is 0 */ + if (sect_done == 0) { + if (retry > 0) { + retry--; + fprintf(stderr, "Programming failed. Retrying... (%d)\n", retry); + goto do_retry; + } + fprintf(stderr, "Programming failed! Aborting...\n"); + goto out; + } else { + fprintf(stderr, "Programmed %d/%jd bytes\r", sect_done * sect_size, (intmax_t)fw_size); + } + + /* read the next firmware chunk (if any) */ + chunk_size = read(img_fd, buf, 512); + } + + if ((sect_done * sect_size) == fw_size) { + fprintf(stderr, "Programmed %jd/%jd bytes\n", (intmax_t)fw_size, (intmax_t)fw_size); + fprintf(stderr, "Programming finished with status %d \n", ret); + } + else { + fprintf(stderr, "FW size and number of sectors written mismatch. Status return %d\n", ret); + goto out; + } + + /* check mode operation for ffu install*/ + if (!ext_csd[EXT_CSD_FFU_FEATURES]) { + fprintf(stderr, "Please reboot to complete firmware installation on %s\n", device); + } else { + fprintf(stderr, "Installing firmware on %s...\n", device); + /* Re-enter ffu mode and install the firmware */ + multi_cmd->num_of_cmds = 2; + + /* set ext_csd to install mode */ + multi_cmd->cmds[1].opcode = MMC_SWITCH; + multi_cmd->cmds[1].blksz = 0; + multi_cmd->cmds[1].blocks = 0; + multi_cmd->cmds[1].arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | + (EXT_CSD_MODE_OPERATION_CODES << 16) | + (EXT_CSD_FFU_INSTALL << 8) | + EXT_CSD_CMD_SET_NORMAL; + multi_cmd->cmds[1].flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; + multi_cmd->cmds[1].write_flag = 1; + + /* send ioctl with multi-cmd */ + ret = ioctl(dev_fd, MMC_IOC_MULTI_CMD, multi_cmd); + + if (ret) { + perror("Multi-cmd ioctl failed setting install mode"); + /* In case multi-cmd ioctl failed before exiting from ffu mode */ + ioctl(dev_fd, MMC_IOC_CMD, &multi_cmd->cmds[2]); + goto out; + } + + ret = read_extcsd(dev_fd, ext_csd); + if (ret) { + fprintf(stderr, "Could not read EXT_CSD from %s\n", device); + goto out; + } + + /* return status */ + ret = ext_csd[EXT_CSD_FFU_STATUS]; + if (ret) { + fprintf(stderr, "%s: error %d during FFU install:\n", device, ret); + goto out; + } else { + fprintf(stderr, "FFU finished successfully\n"); + } + } + +out: + free(buf); + free(multi_cmd); + close(img_fd); + close(dev_fd); + return ret; +#endif +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mmc-utils-0.1~git.20160223/mmc_cmds.h new/mmc-utils-0.1~git.20160308/mmc_cmds.h --- old/mmc-utils-0.1~git.20160223/mmc_cmds.h 2016-03-01 17:38:32.000000000 +0100 +++ new/mmc-utils-0.1~git.20160308/mmc_cmds.h 2016-03-09 17:42:06.000000000 +0100 @@ -12,6 +12,9 @@ * License along with this program; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 021110-1307, USA. + * + * Modified to add field firmware update support, + * those modifications are Copyright (c) 2016 SanDisk Corp. */ /* mmc_cmds.c */ @@ -36,6 +39,7 @@ int do_rpmb_write_block(int nargs, char **argv); int do_cache_en(int nargs, char **argv); int do_cache_dis(int nargs, char **argv); +int do_ffu(int nargs, char **argv); int do_read_scr(int argc, char **argv); int do_read_cid(int argc, char **argv); int do_read_csd(int argc, char **argv);