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