-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mmc: core: Add mmc CMD+ACMD passthrough ioctl
Allows appropriately-privileged applications to send CMD (normal) and ACMD (application-specific; preceded with CMD55) commands to cards/devices on the mmc bus. This is primarily useful for enabling the security functionality built in to every SD card. It can also be used as a generic passthrough (e.g. to enable virtual machines to control mmc bus devices directly). However, this use case has not been tested rigorously. Generic passthrough testing was only conducted for a few non-security opcodes to prove the feasibility of the passthrough. Since any opcode can be sent using this passthrough, it is very possible to render the card/device unusable. Applications that use this ioctl must have CAP_SYS_RAWIO. Security commands tested on TI PCIxx12 (SDHCI), Sigma Designs SMP8652 SoC, TI OMAP3621/OMAP3630 SoC, Samsung S5PC110 SoC, Qualcomm MSM7200A SoC. Signed-off-by: John Calixto <john.calixto@modsystems.com> Reviewed-by: Andrei Warkentin <andreiw@motorola.com> Reviewed-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Chris Ball <cjb@laptop.org>
- Loading branch information
John Calixto
authored and
Chris Ball
committed
May 25, 2011
1 parent
641c318
commit cb87ea2
Showing
7 changed files
with
261 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
header-y += ioctl.h |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
#ifndef LINUX_MMC_IOCTL_H | ||
#define LINUX_MMC_IOCTL_H | ||
struct mmc_ioc_cmd { | ||
/* Implies direction of data. true = write, false = read */ | ||
int write_flag; | ||
|
||
/* Application-specific command. true = precede with CMD55 */ | ||
int is_acmd; | ||
|
||
__u32 opcode; | ||
__u32 arg; | ||
__u32 response[4]; /* CMD response */ | ||
unsigned int flags; | ||
unsigned int blksz; | ||
unsigned int blocks; | ||
|
||
/* | ||
* Sleep at least postsleep_min_us useconds, and at most | ||
* postsleep_max_us useconds *after* issuing command. Needed for | ||
* some read commands for which cards have no other way of indicating | ||
* they're ready for the next command (i.e. there is no equivalent of | ||
* a "busy" indicator for read operations). | ||
*/ | ||
unsigned int postsleep_min_us; | ||
unsigned int postsleep_max_us; | ||
|
||
/* | ||
* Override driver-computed timeouts. Note the difference in units! | ||
*/ | ||
unsigned int data_timeout_ns; | ||
unsigned int cmd_timeout_ms; | ||
|
||
/* | ||
* For 64-bit machines, the next member, ``__u64 data_ptr``, wants to | ||
* be 8-byte aligned. Make sure this struct is the same size when | ||
* built for 32-bit. | ||
*/ | ||
__u32 __pad; | ||
|
||
/* DAT buffer */ | ||
__u64 data_ptr; | ||
}; | ||
#define mmc_ioc_cmd_set_data(ic, ptr) ic.data_ptr = (__u64)(unsigned long) ptr | ||
|
||
#define MMC_IOC_CMD _IOWR(MMC_BLOCK_MAJOR, 0, struct mmc_ioc_cmd) | ||
|
||
/* | ||
* 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 | ||
* is enforced per ioctl call. For larger data transfers, use the normal | ||
* block device operations. | ||
*/ | ||
#define MMC_IOC_MAX_BYTES (512L * 256) | ||
#endif /* LINUX_MMC_IOCTL_H */ |