platform: msm_shared: Add support for rpmb
Add support for rpmb listener, rpmb driver for emmc & ufs.
Change-Id: Iacfb2bd34d6ddc309f2c7f5422576fa253322f82
diff --git a/platform/msm_shared/include/rpmb.h b/platform/msm_shared/include/rpmb.h
index 8bbd985..6cd7ecd 100644
--- a/platform/msm_shared/include/rpmb.h
+++ b/platform/msm_shared/include/rpmb.h
@@ -26,6 +26,49 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#ifndef _RPMB_H_
+#define _RPMB_H_
+
+#include <qseecom_lk_api.h>
+#include <mmc_sdhci.h>
+#include <ufs.h>
+#include <debug.h>
+
+#define RPMB_SECTOR_SIZE 256
+#define RPMB_LSTNR_ID 0x2000
+#define RPMB_BLK_SIZE 512
+#define RPMB_FRAME_SIZE 512
+#define RPMB_MIN_BLK_CNT 1
+#define RPMB_MIN_BLK_SZ 512
+
+enum app_commands
+{
+ CLIENT_CMD_READ_LK_DEVICE_STATE = 0,
+ CLIENT_CMD_LK_END_MILESTONE,
+ CLIENT_CMD_GET_VERSION,
+ CLIENT_CMD_WRITE_LK_DEVICE_STATE,
+};
+
+struct send_cmd_req
+{
+ uint32_t cmd_id;
+ uint32_t data;
+ uint32_t len;
+}__PACKED;
+
+struct send_cmd_rsp
+{
+ uint32_t cmd_id;
+ uint32_t data;
+ int32_t status;
+}__PACKED;
+
+enum device_type
+{
+ EMMC_RPMB = 3,
+ UFS_RPMB = 9,
+};
+
/* RPMB request and response types */
enum rpmb_rr_type {
KEY_PROVISION = 0x1,
@@ -62,9 +105,61 @@
uint8_t keyMAC[32];
uint8_t data[256];
uint8_t nonce[16];
- uint32_t writecounter;
- uint16_t address;
- uint16_t blockcount;
+ uint8_t writecounter[4];
+ uint8_t address[2];
+ uint8_t blockcount[2];
uint8_t result[2];
- uint16_t requestresponse;
+ uint8_t requestresponse[2];
};
+
+struct rpmb_init_info
+{
+ uint32_t size;
+ uint32_t rel_wr_count;
+ uint32_t dev_type;
+};
+
+/* dump a given RPMB frame */
+static inline void dump_rpmb_frame(uint8_t *frame, const char *frame_type)
+{
+ int i;
+ char buf[512] = {0};
+ char *p = buf;
+
+ printf("Printing %s frame (in hex)\n", frame_type);
+ printf("________0__1__2__3__4__5__6__7__8__9__A__B__C__D__E__F__0__1__2__3__4__5__6__7__8__9__A__B__C__D__E__F\n");
+ for (i = 0; i < 512; i++) {
+ if (!(i % 32)) {
+ snprintf(p, 8, "| %2d | ", (i + 1) / 32);
+ p += 7;
+ }
+ snprintf(p, 4, "%.2x ", frame[i]);
+ p += 3;
+ if (((i + 1) % 32) == 0) {
+ printf("%s\n", buf);
+ p = buf;
+ }
+ }
+ printf("________F__E__D__C__B__A__9__8__7__6__5__4__3__2__1__0__F__E__D__C__B__A__9__8__7__6__5__4__3__2__1__0\n");
+}
+
+int read_device_info_rpmb(void *info, uint32_t sz);
+int write_device_info_rpmb(void *info, uint32_t sz);
+
+/* Function Prototypes */
+int rpmb_write_emmc(struct mmc_device *dev, uint32_t *req_buf, uint32_t blk_cnt, uint32_t *resp_buf, uint32_t *resp_len);
+int rpmb_read_emmc(struct mmc_device *dev, uint32_t *req_buf, uint32_t blk_cnt, uint32_t *resp_buf, uint32_t *resp_len);
+int rpmb_write_ufs(struct ufs_dev *dev, uint32_t *req_buf, uint32_t blk_cnt, uint32_t *resp_buf, uint32_t *resp_len);
+int rpmb_read_ufs(struct ufs_dev *dev, uint32_t *req_buf, uint32_t blk_cnt, uint32_t *resp_buf, uint32_t *resp_len);
+
+/* APIs exposed to applications */
+int rpmb_init();
+int rpmb_uninit();
+int rpmb_write(uint32_t *req_buf, uint32_t blk_cnt, uint32_t *resp_buf, uint32_t *resp_len);
+int rpmb_read(uint32_t *req_buf, uint32_t blk_cnt, uint32_t *resp_buf, uint32_t *resp_len);
+struct rpmb_init_info *rpmb_get_init_info();
+int rpmb_get_app_handle();
+bool is_sec_app_loaded();
+int load_sec_app();
+int unload_sec_app();
+#endif