15d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin#ifndef LINUX_MMC_IOCTL_H 25d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin#define LINUX_MMC_IOCTL_H 35d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 45d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin#include <linux/types.h> 55d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 65d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjinstruct mmc_ioc_cmd { 75d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin /* Implies direction of data. true = write, false = read */ 85d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin int write_flag; 95d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 105d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin /* Application-specific command. true = precede with CMD55 */ 115d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin int is_acmd; 125d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 135d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin __u32 opcode; 145d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin __u32 arg; 155d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin __u32 response[4]; /* CMD response */ 165d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin unsigned int flags; 175d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin unsigned int blksz; 185d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin unsigned int blocks; 195d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 205d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin /* 215d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * Sleep at least postsleep_min_us useconds, and at most 225d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * postsleep_max_us useconds *after* issuing command. Needed for 235d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * some read commands for which cards have no other way of indicating 245d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * they're ready for the next command (i.e. there is no equivalent of 255d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * a "busy" indicator for read operations). 265d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin */ 275d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin unsigned int postsleep_min_us; 285d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin unsigned int postsleep_max_us; 295d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 305d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin /* 315d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * Override driver-computed timeouts. Note the difference in units! 325d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin */ 335d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin unsigned int data_timeout_ns; 345d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin unsigned int cmd_timeout_ms; 355d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 365d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin /* 375d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * For 64-bit machines, the next member, ``__u64 data_ptr``, wants to 385d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * be 8-byte aligned. Make sure this struct is the same size when 395d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * built for 32-bit. 405d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin */ 415d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin __u32 __pad; 425d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 435d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin /* DAT buffer */ 445d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin __u64 data_ptr; 455d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin}; 465d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin#define mmc_ioc_cmd_set_data(ic, ptr) ic.data_ptr = (__u64)(unsigned long) ptr 475d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 485d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin#define MMC_IOC_CMD _IOWR(MMC_BLOCK_MAJOR, 0, struct mmc_ioc_cmd) 495d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 505d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin/** 515d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * There are four request types that are applicable for rpmb accesses- two 525d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * under read category and two under write. They are 535d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 545d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * Reads 555d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * ------- 565d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 1. Read Write Counter 575d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 2. Authenticated data read 585d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 595d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 605d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * Writes 615d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * ------- 625d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 1. Provision RPMB key (though it might be done in a secure environment) 635d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 2. Authenticated data write 645d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 655d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * While its given that the rpmb data frames are going to have that 665d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * information encoded in it and the frames should be generated by a secure 675d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * piece of code, the request types can be classified as above. 685d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 695d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * So here are the set of commands that should be executed atomically in the 705d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * ioctl for rpmb read operation 715d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 1. Switch partition 725d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 2. Set block count 735d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 3. Write data frame - CMD25 to write the rpmb data frame 745d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 4. Set block count 755d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 5. Read the data - CMD18 to do the actual read 765d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 775d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * Similarly for rpmb write operation, these are the commands that should be 785d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * executed atomically in the ioctl for rpmb write operation 795d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 1. Switch partition 805d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 2. Set block count 815d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 3. Write data frame - CMD25 to write the rpmb data frame with data 825d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 4. Set block count 835d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 5. Read the data - CMD25 to write rpmb data frame indicating that rpmb 845d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * result register is about to be read 855d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 6. Set block count 865d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 7. Read rpmb result - CMD18 to read the rpmb result register 875d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * 885d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * Each of the above commands should be sent individually via struct mmc_ioc_cmd 895d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * and fields like is_acmd that are not needed for rpmb operations will be 905d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * ignored. 915d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin */ 925d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin#define MMC_IOC_MAX_RPMB_CMD 3 935d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjinstruct mmc_ioc_rpmb { 945d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin struct mmc_ioc_cmd cmds[MMC_IOC_MAX_RPMB_CMD]; 955d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin}; 965d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 975d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin/* 985d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * This ioctl is meant for use with rpmb partitions. This is needed since the 995d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * access procedure for this particular partition is different from regular 1005d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * or normal partitions. 1015d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin */ 1025d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin#define MMC_IOC_RPMB_CMD _IOWR(MMC_BLOCK_MAJOR, 0, struct mmc_ioc_rpmb) 1035d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin 1045d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin/* 1055d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * Since this ioctl is only meant to enhance (and not replace) normal access 1065d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * to the mmc bus device, an upper data transfer limit of MMC_IOC_MAX_BYTES 1075d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * is enforced per ioctl call. For larger data transfers, use the normal 1085d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin * block device operations. 1095d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin */ 1105d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin#define MMC_IOC_MAX_BYTES (512L * 256) 1115d6a7fb6f1a9ff1d898b290fc7c0b2695cf22229Patrick Tjin#endif /* LINUX_MMC_IOCTL_H */ 112