/* 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
 * met:
 * * Redistributions of source code must retain the above copyright
 *  notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following
 * disclaimer in the documentation and/or other materials provided
 *  with the distribution.
 *   * Neither the name of The Linux Foundation nor the names of its
 * contributors may be used to endorse or promote products derived
 * from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include <debug.h>
#include <list.h>
#include <bits.h>

#ifndef __DEVICE_TREE__
#define __DEVICE_TREE__

#define DEV_TREE_SUCCESS        0
#define DEV_TREE_MAGIC          0x54444351 /* "QCDT" */
#define DEV_TREE_MAGIC_LEN      4
#define DEV_TREE_VERSION_V1     1
#define DEV_TREE_VERSION_V2     2
#define DEV_TREE_VERSION_V3     3

#define DEV_TREE_HEADER_SIZE    12

#define DTB_MAGIC               0xedfe0dd0
#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 MAX_SUPPORTED_DTBO_IMG_BUF (8388608)  /* 8MB   8 * 1024 * 1024 */
#define DTBO_IMG_BUF               (10485760) /* 10MB 10 * 1024 * 1024 */
/*
 * For DTB V1: The DTB entries would be of the format
 * qcom,msm-id = <msm8974, CDP, rev_1>; (3 * sizeof(uint32_t))
 * For DTB V2: The DTB entries would be of the format
 * qcom,msm-id   = <msm8974, rev_1>;  (2 * sizeof(uint32_t))
 * qcom,board-id = <CDP, subtype_ID>; (2 * sizeof(uint32_t))
 * The macros below are defined based on these.
 */
#define DT_ENTRY_V1_SIZE        0xC
#define PLAT_ID_SIZE            0x8
#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
{
	uint32_t platform_id;
	uint32_t variant_id;
	uint32_t board_hw_subtype;
	uint32_t soc_rev;
	uint32_t offset;
	uint32_t size;
};

struct dt_entry
{
	uint32_t platform_id;
	uint32_t variant_id;
	uint32_t board_hw_subtype;
	uint32_t soc_rev;
	uint32_t pmic_rev[4];
	uint32_t offset;
	uint32_t size;
};

struct dt_table
{
	uint32_t magic;
	uint32_t version;
	uint32_t num_entries;
};

struct plat_id
{
	uint32_t platform_id;
	uint32_t soc_rev;
};

struct board_id
{
	uint32_t variant_id;
	uint32_t platform_subtype;
};

struct pmic_id
{
	uint32_t pmic_version[4];
};

struct dt_mem_node_info
{
	uint32_t offset;
	uint32_t mem_info_cnt;
	uint32_t addr_cell_size;
	uint32_t size_cell_size;
};

enum dt_entry_info
{
	DTB_FOUNDRY = 0,
	DTB_SOC,
	DTB_MAJOR_MINOR,
	DTB_PMIC0,
	DTB_PMIC1,
	DTB_PMIC2,
	DTB_PMIC3,
	DTB_PMIC_MODEL,
	DTB_PANEL_TYPE,
	DTB_BOOT_DEVICE,
};

enum dt_err_codes
{
	DT_OP_SUCCESS,
	DT_OP_FAILURE = -1,
};

typedef struct dt_entry_node {
	struct list_node node;
	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
};

typedef enum dtbo_error
{
	DTBO_ERROR = 0,
	DTBO_NOT_SUPPORTED = 1,
	DTBO_SUCCESS = 2
}dtbo_error;

dtbo_error load_validate_dtbo_image(void **dtbo_img, uint32_t *dtbo_img_size);
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);
int dev_tree_add_mem_info(void *fdt, uint32_t offset, uint64_t size, uint64_t addr);
void *dev_tree_appended(void *kernel, uint32_t kernel_size, uint32_t dtb_offset, void *tags);
int get_dtbo_idx (void);
#endif
