/*
 * Copyright (c) 2015-2018, NVIDIA CORPORATION.  All Rights Reserved.
 *
 * NVIDIA Corporation and its licensors retain all intellectual property and
 * proprietary rights in and to this software and related documentation.  Any
 * use, reproduction, disclosure or distribution of this software and related
 * documentation without an express license agreement from NVIDIA Corporation
 * is strictly prohibited.
 */

#ifndef TEGRABL_ODMDATA_SOC_H
#define TEGRABL_ODMDATA_SOC_H

#include <stddef.h>
#include <stdint.h>
#include <tegrabl_error.h>
#include <tegrabl_odmdata_lib.h>

#define PCIE_XBAR_BIT_OFFSET			27
#define PCIE_XBAR_MASK					(0x1f << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_2_1_1_1_2_VAL			0x0
#define PCIE_XBAR_4_1_0_1_2_VAL			(0x01 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_4_1_1_1_2_VAL			(0x02 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_4_0_0_1_2_VAL			(0x03 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_4_1_0_1_2_C1L6_VAL	(0x04 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_4_0_1_1_2_VAL			(0x05 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_4_1_1_1_2_C1L6_VAL	(0x06 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_2_1_1_0_4_VAL			(0x07 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_2_1_1_1_4_VAL			(0x08 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_4_1_0_0_4_VAL			(0x09 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_4_1_0_1_4_VAL			(0x0a << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_4_1_1_0_4_VAL			(0x0b << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_4_1_1_1_4_VAL			(0x0c << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_1_0_0_0_VAL			(0x0d << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_1_0_1_0_VAL			(0x0e << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_0_0_0_2_VAL			(0x0f << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_1_1_0_0_VAL			(0x10 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_1_1_1_0_VAL			(0x11 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_0_1_0_2_VAL			(0x12 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_1_0_0_1_VAL			(0x13 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_1_0_1_1_VAL			(0x14 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_1_0_0_2_VAL			(0x15 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_1_0_1_2_VAL			(0x16 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_1_1_0_1_VAL			(0x17 << PCIE_XBAR_BIT_OFFSET)
#define PCIE_XBAR_8_1_1_1_1_VAL			(0x18 << PCIE_XBAR_BIT_OFFSET)

#define PCIE_C0_BIT_OFFSET				26
#define PCIE_C0_MASK					(0x01 << PCIE_C0_BIT_OFFSET)
#define PCIE_C0_DISABLED_VAL			0x0
#define PCIE_C0_ENABLED_VAL				(0x01 << PCIE_C0_BIT_OFFSET)

#define PCIE_C4_BIT_OFFSET				25
#define PCIE_C4_MASK					(0x01 << PCIE_C4_BIT_OFFSET)
#define PCIE_C4_DISABLED_VAL			0x0
#define PCIE_C4_ENABLED_VAL				(0x01 << PCIE_C4_BIT_OFFSET)

#define PCIE_C5_BIT_OFFSET				12
#define PCIE_C5_MASK					(0x01 << PCIE_C5_BIT_OFFSET)
#define PCIE_C5_DISABLED_VAL			0x0
#define PCIE_C5_ENABLED_VAL				(0x01 << PCIE_C5_BIT_OFFSET)

#define UFS_HSIO_UPHY_BIT_OFFSET		23
#define UFS_HSIO_UPHY_MASK				(0x03 << UFS_HSIO_UPHY_BIT_OFFSET)
#define UFS_HSIO_UPHY_DISABLED_VAL		0x0
#define UFS_HSIO_UPHY_L11_VAL			(0x01 << UFS_HSIO_UPHY_BIT_OFFSET)
#define UFS_HSIO_UPHY_L10_VAL			(0x02 << UFS_HSIO_UPHY_BIT_OFFSET)
#define UFS_HSIO_UPHY_L10_L11_VAL		(0x03 << UFS_HSIO_UPHY_BIT_OFFSET)

#define SATA_BIT_OFFSET					22
#define SATA_MASK						(0x01 << SATA_BIT_OFFSET)
#define SATA_DISABLED_VAL				0x0
#define SATA_ENABLED_VAL				(0x01 << SATA_BIT_OFFSET)

#define NVHS_UPHY_BIT_MASK				20
#define NVHS_UPHY_MASK					(0x03 << NVHS_UPHY_BIT_MASK)
#define NVHS_UPHY_DISABLED_VAL			0x0
#define NVHS_UPHY_PCIE_C5_VAL			(0x01 << NVHS_UPHY_BIT_MASK)
#define NVHS_UPHY_SLVS_VAL				(0x02 << NVHS_UPHY_BIT_MASK)
#define NVHS_UPHY_NVLINK_VAL			(0x03 << NVHS_UPHY_BIT_MASK)

#define DEBUG_CONSOLE_BIT_OFFSET		18
#define DEBUG_CONSOLE_MASK				(0x03 << DEBUG_CONSOLE_BIT_OFFSET)
#define ENABLE_DEBUG_CONSOLE_VAL		(0x02 << DEBUG_CONSOLE_BIT_OFFSET)
#define ENABLE_HIGHSPEED_UART_VAL		0x0

#define MODS_BUILD_MASK					0x1
#define NORMAL_BUILD_VAL				0x0
#define MODS_BUILD_VAL					0x1
#define L4T_BUILD_VAL					0x2

#define DENVER_WDT_BIT_OFFSET			16
#define DENVER_WDT_MASK					(0x1 << DENVER_WDT_BIT_OFFSET)
#define DISABLE_DENVER_WDT_VAL			0x0
#define ENABLE_DENVER_WDT_VAL			(0x1 << DENVER_WDT_BIT_OFFSET)

#define PMIC_WDT_BIT_OFFSET				17
#define PMIC_WDT_MASK					(0x1 << PMIC_WDT_BIT_OFFSET)
#define DISABLE_PMIC_WDT_VAL			0x0
#define ENABLE_PMIC_WDT_VAL				(0x1 << PMIC_WDT_BIT_OFFSET)

#define BATTERY_ADAPTER_BIT_OFFSET		14
#define BATTERY_ADAPTER_MASK			(0x3 << BATTERY_ADAPTER_BIT_OFFSET)
#define NO_BATTERY_VAL					0x0
#define BATTERY_CONNECTED_VAL			(0x1 << BATTERY_ADAPTER_BIT_OFFSET)

#define TEGRA_BOOTMODE_MASK			(0x7 << 3)
#define TEGRA_BOOTMODE_ANDROID_UI_VAL		(0x0 << 3)
#define TEGRA_BOOTMODE_ANDROID_SHELL_VAL	(0x1 << 3)
#define TEGRA_BOOTMODE_ANDROID_PRESI_VAL	(0x2 << 3)
#define TEGRA_BOOTLOADER_LOCK_BIT   13
#define BOOTLOADER_LOCK_MASK		(0x1 << TEGRA_BOOTLOADER_LOCK_BIT)
#define BOOTLOADER_LOCK_VAL			(0x1 << TEGRA_BOOTLOADER_LOCK_BIT)
#define BOOTLOADER_UNLOCK_VAL		0x0

/* macro odmdata prop type */
typedef uint32_t odmdata_prop_type_t;
#define ENABLE_DEBUG_CONSOLE 0
#define DISABLE_DEBUG_CONSOLE 1
#define NORMAL_BUILD 2
#define MODS_BUILD 3
#define DISABLE_DENVER_WDT 4
#define ENABLE_DENVER_WDT 5
#define DISABLE_PMIC_WDT 6
#define ENABLE_PMIC_WDT 7
#define NO_BATTERY 8
#define BATTERY_CONNECTED 9
#define PCIE_XBAR_2_1_1_1_2 10
#define PCIE_XBAR_4_1_0_1_2 11
#define PCIE_XBAR_4_1_1_1_2 12
#define PCIE_XBAR_4_0_0_1_2 13
#define PCIE_XBAR_4_1_0_1_2_C1L6 14
#define PCIE_XBAR_4_0_1_1_2 15
#define PCIE_XBAR_4_1_1_1_2_C1L6 16
#define PCIE_XBAR_2_1_1_0_4 17
#define PCIE_XBAR_2_1_1_1_4 18
#define PCIE_XBAR_4_1_0_0_4 19
#define PCIE_XBAR_4_1_0_1_4 20
#define PCIE_XBAR_4_1_1_0_4 21
#define PCIE_XBAR_4_1_1_1_4 22
#define PCIE_XBAR_8_1_0_0_0 23
#define PCIE_XBAR_8_1_0_1_0 24
#define PCIE_XBAR_8_0_0_0_2 25
#define PCIE_XBAR_8_1_1_0_0 26
#define PCIE_XBAR_8_1_1_1_0 27
#define PCIE_XBAR_8_0_1_0_2 28
#define PCIE_XBAR_8_1_0_0_1 29
#define PCIE_XBAR_8_1_0_1_1 30
#define PCIE_XBAR_8_1_0_0_2 31
#define PCIE_XBAR_8_1_0_1_2 32
#define PCIE_XBAR_8_1_1_0_1 33
#define PCIE_XBAR_8_1_1_1_1 34
#define DISABLE_PCIE_C0_ENDPOINT 35
#define ENABLE_PCIE_C0_ENDPOINT 36
#define DISABLE_PCIE_C4_ENDPOINT 37
#define ENABLE_PCIE_C4_ENDPOINT 38
#define DISABLE_UFS_UPHY 39
#define ENABLE_UFS_UPHY_L11 40
#define ENABLE_UFS_UPHY_L10 41
#define ENABLE_UFS_UPHY_L10_L11 42
#define DISABLE_SATA 43
#define ENABLE_SATA 44
#define DISABLE_NVHS_UPHY 45
#define ENABLE_NVHS_UPHY_PCIE_C5 46
#define ENABLE_NVHS_UPHY_SLVS 47
#define ENABLE_NVHS_UPHY_NVLINK 48
#define BOOTLOADER_LOCK 49
#define BOOTLOADER_UNLOCK 50
#define DISABLE_PCIE_C5_ENDPOINT 51
#define ENABLE_PCIE_C5_ENDPOINT 52
#define ODMDATA_PROP_TYPE_MAX 53

#endif /* TEGRABL_ODMDATA_SOC_H */
