From 8a3d5e6ab01db13a866c356f15118575ee5e6ca6 Mon Sep 17 00:00:00 2001 From: Krishna Konda Date: Thu, 4 Dec 2014 15:20:57 +0200 Subject: [PATCH] mmc: card: Fix RPMB IOCTL to handle all cards The eMMC 4.5 spec for RPMB accesses is not very clear on whether user parition accesses can be allowed in the middle of RPMB accesses. Due to this ambiguity, it turns out this is implementation defined and certain cards support it while others do not. In order to allow this feature to function across a wide variety of cards, this patch takes the pessimistic approach and ensures that any RPMB access is completed before user partition can be accessed. Change-Id: I77959f462c874771a0a854d9a2bc48df446eff56 Signed-off-by: Krishna Konda Signed-off-by: Oluwafemi Adeyemi Signed-off-by: Venkat Gopalakrishnan [merez@codeaurora: fix conflicts due to changes in 3.14] Signed-off-by: Maya Erez [venkatg@codeaurora: pick only ioctl header changes and drop rest] Signed-off-by: Venkat Gopalakrishnan --- include/uapi/linux/mmc/ioctl.h | 55 ++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/include/uapi/linux/mmc/ioctl.h b/include/uapi/linux/mmc/ioctl.h index 7e385b83b9d8..9097817b8ddc 100644 --- a/include/uapi/linux/mmc/ioctl.h +++ b/include/uapi/linux/mmc/ioctl.h @@ -63,6 +63,61 @@ struct mmc_ioc_multi_cmd { * commands in array in sequence to card. */ #define MMC_IOC_MULTI_CMD _IOWR(MMC_BLOCK_MAJOR, 1, struct mmc_ioc_multi_cmd) + +/** + * There are four request types that are applicable for rpmb accesses- two + * under read category and two under write. They are + * + * Reads + * ------- + * 1. Read Write Counter + * 2. Authenticated data read + * + * + * Writes + * ------- + * 1. Provision RPMB key (though it might be done in a secure environment) + * 2. Authenticated data write + * + * While its given that the rpmb data frames are going to have that + * information encoded in it and the frames should be generated by a secure + * piece of code, the request types can be classified as above. + * + * So here are the set of commands that should be executed atomically in the + * ioctl for rpmb read operation + * 1. Switch partition + * 2. Set block count + * 3. Write data frame - CMD25 to write the rpmb data frame + * 4. Set block count + * 5. Read the data - CMD18 to do the actual read + * + * Similarly for rpmb write operation, these are the commands that should be + * executed atomically in the ioctl for rpmb write operation + * 1. Switch partition + * 2. Set block count + * 3. Write data frame - CMD25 to write the rpmb data frame with data + * 4. Set block count + * 5. Read the data - CMD25 to write rpmb data frame indicating that rpmb + * result register is about to be read + * 6. Set block count + * 7. Read rpmb result - CMD18 to read the rpmb result register + * + * Each of the above commands should be sent individually via struct mmc_ioc_cmd + * and fields like is_acmd that are not needed for rpmb operations will be + * ignored. + */ +#define MMC_IOC_MAX_RPMB_CMD 3 +struct mmc_ioc_rpmb { + struct mmc_ioc_cmd cmds[MMC_IOC_MAX_RPMB_CMD]; +}; + +/* + * This ioctl is meant for use with rpmb partitions. This is needed since the + * access procedure for this particular partition is different from regular + * or normal partitions. + */ +#define MMC_IOC_RPMB_CMD _IOWR(MMC_BLOCK_MAJOR, 0, struct mmc_ioc_rpmb) + /* * Since this ioctl is only meant to enhance (and not replace) normal access * to the mmc bus device, an upper data transfer limit of MMC_IOC_MAX_BYTES