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 <kkonda@codeaurora.org> Signed-off-by: Oluwafemi Adeyemi <aadeyemi@codeaurora.org> Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org> [merez@codeaurora: fix conflicts due to changes in 3.14] Signed-off-by: Maya Erez <merez@codeaurora.org> [venkatg@codeaurora: pick only ioctl header changes and drop rest] Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
This commit is contained in:
parent
f2b1fed1bd
commit
8a3d5e6ab0
1 changed files with 55 additions and 0 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue