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);