platform: msm_shared: Implement dtb overlay in lk

Change to enable DTB Overlay support in LK.
	* Add functionality to detect dtbo partition on runtime.
	* Get SoC dtb and board dtb.
	* Overlay to form complete dtb.

Change-Id: I0c4f381517b397795f4e8be494ce3b2ee4656051
diff --git a/platform/msm_shared/include/dev_tree.h b/platform/msm_shared/include/dev_tree.h
index 1d2bd44..6457525 100755
--- a/platform/msm_shared/include/dev_tree.h
+++ b/platform/msm_shared/include/dev_tree.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2014,2017-2018 The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -28,6 +28,7 @@
 
 #include <debug.h>
 #include <list.h>
+#include <bits.h>
 
 #ifndef __DEVICE_TREE__
 #define __DEVICE_TREE__
@@ -45,7 +46,19 @@
 #define DTB_OFFSET              0x2C
 
 #define DTB_PAD_SIZE            1024
-
+#define DTBO_TABLE_MAGIC        0xD7B7AB1E
+#define DTBO_CUSTOM_MAX         4
+#define PLATFORM_FOUNDRY_SHIFT  16
+#define SOC_MASK                  (0xffff)
+#define VARIANT_MASK              (0x000000ff)
+#define VARIANT_MINOR_MASK        (0x0000ff00)
+#define VARIANT_MAJOR_MASK        (0x00ff0000)
+#define PMIC_MODEL_MASK           (0x000000ff)
+#define PMIC_REV_MASK             (0xffffff00)
+#define PMIC_SHIFT_IDX            (2)
+#define PLATFORM_SUBTYPE_SHIFT_ID (0x18)
+#define FOUNDRY_ID_MASK           (0x00ff0000)
+#define DTBO_IMG_BUF             (8388608) /* 8MB 8 * 1024 * 1024 */
 /*
  * For DTB V1: The DTB entries would be of the format
  * qcom,msm-id = <msm8974, CDP, rev_1>; (3 * sizeof(uint32_t))
@@ -59,6 +72,75 @@
 #define BOARD_ID_SIZE           0x8
 #define PMIC_ID_SIZE           0x8
 
+typedef enum {
+	NONE_MATCH,
+	PMIC_MATCH_BEST_REV_IDX0,
+	PMIC_MATCH_EXACT_REV_IDX0,
+	PMIC_MATCH_BEST_REV_IDX1,
+	PMIC_MATCH_EXACT_REV_IDX1,
+	PMIC_MATCH_BEST_REV_IDX2,
+	PMIC_MATCH_EXACT_REV_IDX2,
+	PMIC_MATCH_BEST_REV_IDX3,
+	PMIC_MATCH_EXACT_REV_IDX3,
+	VARIANT_MINOR_BEST_MATCH,
+	VARIANT_MINOR_EXACT_MATCH,
+	VARIANT_MAJOR_BEST_MATCH,
+	VARIANT_MAJOR_EXACT_MATCH,
+	VERSION_BEST_MATCH,
+	VERSION_EXACT_MATCH,
+	FOUNDRYID_DEFAULT_MATCH,
+	FOUNDRYID_EXACT_MATCH,
+	PMIC_MATCH_DEFAULT_MODEL_IDX0,
+	PMIC_MATCH_EXACT_MODEL_IDX0,
+	PMIC_MATCH_DEFAULT_MODEL_IDX1,
+	PMIC_MATCH_EXACT_MODEL_IDX1,
+	PMIC_MATCH_DEFAULT_MODEL_IDX2,
+	PMIC_MATCH_EXACT_MODEL_IDX2,
+	PMIC_MATCH_DEFAULT_MODEL_IDX3,
+	PMIC_MATCH_EXACT_MODEL_IDX3,
+	SUBTYPE_DEFAULT_MATCH,
+	SUBTYPE_EXACT_MATCH,
+	VARIANT_MATCH,
+	SOC_MATCH,
+	MAX_MATCH,
+}dt_match_params;
+
+#define TOTAL_MATCH_BITS 6
+#define ALL_BITS_SET  (BIT (SOC_MATCH) | BIT (VARIANT_MATCH) | \
+                       BIT (SUBTYPE_EXACT_MATCH) | BIT (FOUNDRYID_EXACT_MATCH) \
+                       | BIT (PMIC_MATCH_EXACT_MODEL_IDX0) | \
+                       BIT (PMIC_MATCH_EXACT_MODEL_IDX1))
+
+typedef enum {
+	PMIC_IDX0,
+	PMIC_IDX1,
+	PMIC_IDX2,
+	PMIC_IDX3,
+	MAX_PMIC_IDX,
+}pmic_indexes;
+
+
+typedef struct dt_info
+{
+	uint32_t dt_platform_id;
+	uint32_t dt_soc_rev;
+	uint32_t dt_foundry_id;
+	uint32_t dt_variant_id;
+	uint32_t dt_variant_major;
+	uint32_t dt_variant_minor;
+	uint32_t dt_platform_subtype;
+	uint32_t dt_pmic_model[MAX_PMIC_IDX];
+	uint32_t dt_pmic_rev[MAX_PMIC_IDX];
+	uint32_t dt_match_val;
+	void *dtb;
+}dt_info;
+
+typedef struct pmic_info
+{
+	uint32_t dt_pmic_model[MAX_PMIC_IDX];
+	uint32_t dt_pmic_rev[MAX_PMIC_IDX];
+	uint32_t dt_match_val;
+}pmic_info;
 
 struct dt_entry_v2
 {
@@ -138,6 +220,25 @@
 	struct dt_entry * dt_entry_m;
 }dt_node;
 
+struct dtbo_table_hdr {
+	uint32_t magic;           //dtb table magic
+	uint32_t total_size;       //Includes dt_table_hdr + all dt_table_entry and all dtb/dtbo
+	uint32_t hdr_size;      //sizeof(dt_table_hdr)
+	uint32_t dt_entry_size;     //sizeof(dt_table_entry)
+	uint32_t dt_entry_count;    //number of dt_table_entry
+	uint32_t dt_entry_offset;   //offset to the first dt_table_entry
+	uint32_t page_size;        //flash pagesize we assume
+	uint32_t reserved[1];     //must zeros
+};
+
+struct dtbo_table_entry {
+	uint32_t dt_size;
+	uint32_t dt_offset;     //offset from head of dt_table_hdr
+	uint32_t id;           //optional, must zero if unused
+	uint32_t revision;          //optional, must zero if unused
+	uint32_t custom[DTBO_CUSTOM_MAX];    //optional, must zero if unused
+};
+
 int dev_tree_validate(struct dt_table *table, unsigned int page_size, uint32_t *dt_hdr_size);
 int dev_tree_get_entry_info(struct dt_table *table, struct dt_entry *dt_entry_info);
 int update_device_tree(void *fdt, const char *, void *, unsigned);