emmc_rpmb.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #ifndef _EMMC_RPMB_H
  2. #define _EMMC_RPMB_H
  3. #include <linux/mmc/ioctl.h>
  4. #include <linux/mmc/card.h>
  5. extern struct msdc_host *mtk_msdc_host[];
  6. /************************************************************************
  7. *
  8. * RPMB IOCTL interface.
  9. *
  10. ***********************************************************************/
  11. #define RPMB_IOCTL_PROGRAM_KEY 1
  12. #define RPMB_IOCTL_WRITE_DATA 3
  13. #define RPMB_IOCTL_READ_DATA 4
  14. #if (defined(CONFIG_MICROTRUST_TZ_DRIVER))
  15. #define RPMB_MULTI_BLOCK_ACCESS 1
  16. #if RPMB_MULTI_BLOCK_ACCESS
  17. #define MAX_RPMB_TRANSFER_BLK 16
  18. /* 8KB(16blks) per requests */
  19. #define MAX_RPMB_REQUEST_SIZE (512*MAX_RPMB_TRANSFER_BLK)
  20. #else
  21. #define MAX_RPMB_TRANSFER_BLK 1
  22. /* 512B(1blks) per requests */
  23. #define MAX_RPMB_REQUEST_SIZE (512*MAX_RPMB_TRANSFER_BLK)
  24. #endif
  25. #define RPMB_IOCTL_SOTER_WRITE_DATA 5
  26. #define RPMB_IOCTL_SOTER_READ_DATA 6
  27. #define RPMB_IOCTL_SOTER_GET_CNT 7
  28. struct rpmb_infor {
  29. unsigned int size;
  30. unsigned char *data_frame;
  31. };
  32. #endif
  33. struct rpmb_ioc_param {
  34. unsigned char *key;
  35. unsigned char *data;
  36. unsigned int data_len;
  37. unsigned short addr;
  38. unsigned char *hmac;
  39. unsigned int hmac_len;
  40. };
  41. /***********************************************************************/
  42. #define RPMB_SZ_STUFF 196
  43. #define RPMB_SZ_MAC 32
  44. #define RPMB_SZ_DATA 256
  45. #define RPMB_SZ_NONCE 16
  46. struct s_rpmb {
  47. unsigned char stuff[RPMB_SZ_STUFF];
  48. unsigned char mac[RPMB_SZ_MAC];
  49. unsigned char data[RPMB_SZ_DATA];
  50. unsigned char nonce[RPMB_SZ_NONCE];
  51. unsigned int write_counter;
  52. unsigned short address;
  53. unsigned short block_count;
  54. unsigned short result;
  55. unsigned short request;
  56. };
  57. enum {
  58. RPMB_SUCCESS = 0,
  59. RPMB_HMAC_ERROR,
  60. RPMB_RESULT_ERROR,
  61. RPMB_WC_ERROR,
  62. RPMB_NONCE_ERROR,
  63. RPMB_ALLOC_ERROR,
  64. RPMB_TRANSFER_NOT_COMPLETE,
  65. };
  66. #define RPMB_PROGRAM_KEY 1 /* Program RPMB Authentication Key */
  67. #define RPMB_GET_WRITE_COUNTER 2 /* Read RPMB write counter */
  68. #define RPMB_WRITE_DATA 3 /* Write data to RPMB partition */
  69. #define RPMB_READ_DATA 4 /* Read data from RPMB partition */
  70. #define RPMB_RESULT_READ 5 /* Read result request */
  71. #define RPMB_REQ 1 /* RPMB request mark */
  72. #define RPMB_RESP (1 << 1)/* RPMB response mark */
  73. #define RPMB_AVAILABLE_SECTORS 8 /* 4K page size */
  74. #define RPMB_TYPE_BEG 510
  75. #define RPMB_RES_BEG 508
  76. #define RPMB_BLKS_BEG 506
  77. #define RPMB_ADDR_BEG 504
  78. #define RPMB_WCOUNTER_BEG 500
  79. #define RPMB_NONCE_BEG 484
  80. #define RPMB_DATA_BEG 228
  81. #define RPMB_MAC_BEG 196
  82. struct emmc_rpmb_req {
  83. __u16 type; /* RPMB request type */
  84. __u16 *result; /* response or request result */
  85. __u16 blk_cnt; /* Number of blocks(half sector 256B) */
  86. __u16 addr; /* data address */
  87. __u32 *wc; /* write counter */
  88. __u8 *nonce; /* Ramdom number */
  89. __u8 *data; /* Buffer of the user data */
  90. __u8 *mac; /* Message Authentication Code */
  91. __u8 *data_frame;
  92. };
  93. int mmc_rpmb_set_key(struct mmc_card *card, void *key);
  94. int mmc_rpmb_read(struct mmc_card *card, u8 *buf, u16 blk, u16 cnt, void *key);
  95. int mmc_rpmb_write(struct mmc_card *card, u8 *buf, u16 blk, u16 cnt, void *key);
  96. extern void emmc_rpmb_set_host(void *mmc_host);
  97. #endif