blob: 9252ca67e4d909ac329caff47099f0b1bf3fefe0 [file] [log] [blame]
/*
* Copyright (C) 2018 Samsung Electronics Co., Ltd.
*
* Authors: Shaik Ameer Basha(shaik.ameer@samsung.com)
*
* Airbrush DDR OTP description and helper functions.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*/
#ifndef _AIRBRUSH_DDR_OTP_H_
#define _AIRBRUSH_DDR_OTP_H_
#include "airbrush-regs.h"
enum ddr_otp_idx {
/* Important: The below are contigious registers in OTP_WRAPPER starting
* from offset 0x7000
*/
o_DREX_1CHIP_MASKING_0,
o_DREX_1CHIP_MASKING_1,
o_DREX_1CHIP_MASKING_2,
o_DREX_CONCONTROL_0,
o_DREX_CONCONTROL_1,
o_DREX_DFIRSTCONTROL_0,
o_DREX_DFIRSTCONTROL_1,
o_DREX_DIRECTCMD_0,
o_DREX_DIRECTCMD_1,
o_DREX_DIRECTCMD_2,
o_DREX_DIRECTCMD_3,
o_DREX_DIRECTCMD_4,
o_DREX_DIRECTCMD_5,
o_DREX_DIRECTCMD_6,
o_DREX_DIRECTCMD_7,
o_DREX_DIRECTCMD_8,
o_DREX_DIRECTCMD_9,
o_DREX_DIRECTCMD_10,
o_DREX_DIRECTCMD_11,
o_DREX_DIRECTCMD_12,
o_DREX_DIRECTCMD_13,
o_DREX_DIRECTCMD_14,
o_DREX_DIRECTCMD_15,
o_DREX_DIRECTCMD_16,
o_DREX_DIRECTCMD_17,
o_DREX_DIRECTCMD_18,
o_DREX_DIRECTCMD_19,
o_DREX_DIRECTCMD_20,
o_DREX_DIRECTCMD_21,
o_DREX_DIRECTCMD_22,
o_DREX_DIRECTCMD_23,
o_DREX_DIRECTCMD_24,
o_DREX_DIRECTCMD_25,
o_DREX_DIRECTCMD_26,
o_DREX_DIRECTCMD_27,
o_DREX_DIRECTCMD_28,
o_DREX_DIRECTCMD_29,
o_DREX_DIRECTCMD_30,
o_DPHY_CAL_CON0_0,
o_DPHY_CAL_CON0_1,
o_DPHY_CAL_CON0_2,
o_DPHY_CAL_CON0_3,
o_DPHY_CAL_CON0_4,
o_DPHY_CAL_CON0_5,
o_DPHY_CAL_CON2_0,
o_DPHY_CAL_CON2_1,
o_DPHY_CAL_CON2_2,
o_DPHY_CAL_CON2_3,
o_DPHY_CAL_CON2_4,
o_DPHY_CAL_CON2_5,
o_DPHY_CAL_WR_PATTERN_CON4_0,
o_DPHY_CAL_WR_PATTERN_CON4_1,
o_DPHY_GNR_CON0_0,
o_DPHY_GNR_CON0_1,
o_DPHY_GNR_CON0_2,
o_DPHY_GNR_CON0_3,
o_DPHY_LP_CON0_0,
o_DPHY_LP_CON0_1,
o_DPHY_LP_CON0_2,
o_DPHY_MDLL_CON0_0,
o_DPHY_MDLL_CON0_1,
o_DPHY_MDLL_CON0_2,
o_DPHY_MDLL_CON0_3,
o_DPHY_OFFSETD_CON0_0,
o_DPHY_OFFSETD_CON0_1,
o_DPHY_ZQ_CON0_0,
o_DPHY_ZQ_CON0_1,
o_DPHY_ZQ_CON0_2,
o_DPHY_ZQ_CON0_3,
o_DPHY_ZQ_CON0_4,
o_DPHY_ZQ_CON0_5,
o_DPHY_ZQ_CON0_6,
o_DPHY_ZQ_CON0_7,
o_DPHY_ZQ_CON0_8,
o_DPHY_ZQ_CON0_9,
o_DPHY_ZQ_CON0_10,
o_DPHY_ZQ_CON0_11,
o_DPHY_ZQ_CON0_12,
o_DPHY_ZQ_CON0_13,
o_DPHY_ZQ_CON0_14,
o_DPHY_ZQ_CON0_15,
o_DPHY_ZQ_CON0_16,
o_DPHY_ZQ_CON3_0,
o_DPHY_ZQ_CON3_1,
o_DPHY_ZQ_CON3_2,
o_DPHY_ZQ_CON3_3,
o_DPHY_ZQ_CON6_0,
o_DPHY_ZQ_CON6_1,
o_DPHY_ZQ_CON6_2,
o_DPHY_ZQ_CON9_0,
o_DPHY_ZQ_CON9_1,
o_DPHY_ZQ_CON9_2,
o_DPHY_ZQ_CON9_3,
o_DREX_INIT_TRAIN_CONFIG_0,
o_DREX_INIT_TRAIN_CONFIG_1,
o_DREX_INIT_TRAIN_CONFIG_2,
o_DREX_INIT_TRAIN_CONFIG_3,
o_DREX_INIT_TRAIN_CONTROL_0,
o_DREX_INIT_TRAIN_CONTROL_1,
o_DREX_PHYCONTROL0_0,
o_DREX_PHYCONTROL0_1,
o_DREX_PRECHCONFIG0_0,
o_DREX_PRECHCONFIG0_1,
o_DREX_TIMINGDATA0_0,
o_DREX_TIMINGDATA0_1,
o_DREX_TIMINGDATA1_0,
o_DREX_TIMINGDATA1_1,
o_Reserved_DDR_INIT_0,
o_Reserved_DDR_INIT_1,
o_Reserved_DDR_INIT_2,
o_Reserved_DDR_INIT_3,
o_Reserved_DDR_INIT_4,
o_Reserved_DDR_INIT_5,
o_Reserved_DDR_INIT_6,
o_Reserved_DDR_INIT_7,
o_Reserved_DDR_INIT_8,
o_Reserved_DDR_INIT_9,
o_Reserved_DDR_INIT_10,
o_Reserved_DDR_INIT_11,
o_Reserved_DDR_INIT_12,
o_Reserved_DDR_INIT_13,
o_Reserved_DDR_INIT_14,
o_Reserved_DDR_INIT_15,
o_Reserved_DDR_INIT_16,
o_Reserved_DDR_INIT_17,
o_Reserved_DDR_INIT_18,
o_Reserved_DDR_INIT_19,
o_Reserved_DDR_INIT_20,
/* Important: The below are contigious registers in OTP_WRAPPER starting
* from offset 0x7488
*/
o_PCIe_reg_75,
o_PCIe_reg_address_75,
o_PCIe_reg_76,
o_PCIe_reg_address_76,
o_PCIe_reg_77,
o_PCIe_reg_address_77,
o_PCIe_reg_78,
o_PCIe_reg_address_78,
o_PCIe_reg_79,
o_PCIe_reg_address_79,
/* Important: The below are contigious registers in OTP_WRAPPER starting
* from offset 0x6000
*/
o_SECURE_JTAG0,
o_SECURE_JTAG1,
o_SECURE_JTAG2,
o_SECURE_JTAG3,
o_SECURE_JTAG4,
o_SECURE_JTAG5,
o_DDR_OTP_MAX,
};
/* ddr_otp_values[] is used to simulate the OTP memory when the OTP is not
* actually loaded to system.
*/
static uint32_t ddr_otp_values[o_DDR_OTP_MAX] __attribute__ ((section(".otpddr")))= {
[o_DREX_1CHIP_MASKING_0] = 0x0,
[o_DREX_1CHIP_MASKING_1] = 0x1,
[o_DREX_1CHIP_MASKING_2] = 0x2,
[o_DREX_CONCONTROL_0] = 0x8fff0102,
[o_DREX_CONCONTROL_1] = 0x9fff8102,
[o_DREX_DFIRSTCONTROL_0] = 0x0,
[o_DREX_DFIRSTCONTROL_1] = 0x1,
[o_DREX_DIRECTCMD_0] = 0x0010c90, /* [W], MR: 11, OP: 0x24 */
[o_DREX_DIRECTCMD_1] = 0x0011070, /* [W], MR: 12, OP: 0x1c */
[o_DREX_DIRECTCMD_10] = 0x0021850, /* [W], MR: 22, OP: 0x14 */
[o_DREX_DIRECTCMD_11] = 0x300013c, /* NOP */
[o_DREX_DIRECTCMD_12] = 0x3000144, /* NOP */
[o_DREX_DIRECTCMD_13] = 0x0311070, /* [W], MR: 12, OP: 0x1c */
[o_DREX_DIRECTCMD_14] = 0x0311838, /* [W], MR: 14, OP: 0x0e */
[o_DREX_DIRECTCMD_15] = 0x4000000, /* SREF_ENTRY command */
[o_DREX_DIRECTCMD_16] = 0x0040154, /* [W], MR: 32, OP: 0x55 */
[o_DREX_DIRECTCMD_17] = 0x00005b8, /* [W], MR: 01, OP: 0x6e */
[o_DREX_DIRECTCMD_18] = 0x0000418, /* [W], MR: 01, OP: 0x06 */
[o_DREX_DIRECTCMD_19] = 0x00502a8, /* [W], MR: 40, OP: 0xaa */
[o_DREX_DIRECTCMD_2] = 0x0111070, /* [W], MR: 12, OP: 0x1c */
[o_DREX_DIRECTCMD_20] = 0x6000000, /* CKEL command */
[o_DREX_DIRECTCMD_21] = 0x7000000, /* PD_EXIT command */
[o_DREX_DIRECTCMD_22] = 0x8000000, /* SREF_EXIT command */
[o_DREX_DIRECTCMD_23] = 0x00008d8, /* [W], MR: 02, OP: 0x36 */
[o_DREX_DIRECTCMD_24] = 0x000086c, /* [W], MR: 02, OP: 0x1b */
[o_DREX_DIRECTCMD_25] = 0x9000000, /* [R], MR: 00, OP: 0x00 */
[o_DREX_DIRECTCMD_26] = 0x9001400, /* [R], MR: 05, OP: 0x00 */
[o_DREX_DIRECTCMD_27] = 0x9010000, /* [R], MR: 08, OP: 0x00 */
[o_DREX_DIRECTCMD_28] = 0x9101400, /* [R], MR: 05, OP: 0x00 */
[o_DREX_DIRECTCMD_29] = 0x9201400, /* [R], MR: 05, OP: 0x00 */
[o_DREX_DIRECTCMD_3] = 0x0111838, /* [W], MR: 14, OP: 0x0e */
[o_DREX_DIRECTCMD_30] = 0x0000fc4, /* [W], MR: 03, OP: 0xf1 */
[o_DREX_DIRECTCMD_4] = 0x0011420, /* [W], MR: 13, OP: 0x08 */
[o_DREX_DIRECTCMD_5] = 0x0011838, /* [W], MR: 14, OP: 0x0e */
[o_DREX_DIRECTCMD_6] = 0x0011d54, /* [W], MR: 15, OP: 0x55 */
[o_DREX_DIRECTCMD_7] = 0x0211070, /* [W], MR: 12, OP: 0x1c */
[o_DREX_DIRECTCMD_8] = 0x0211838, /* [W], MR: 14, OP: 0x0e */
[o_DREX_DIRECTCMD_9] = 0x00212a8, /* [W], MR: 20, OP: 0xaa */
[o_DPHY_CAL_CON0_0] = 0x780806c0,
[o_DPHY_CAL_CON0_1] = 0x780806c1,
[o_DPHY_CAL_CON0_2] = 0x780806c4,
[o_DPHY_CAL_CON0_3] = 0x780806c5,
[o_DPHY_CAL_CON0_4] = 0x780806cc,
[o_DPHY_CAL_CON0_5] = 0x780806ec,
[o_DPHY_CAL_CON2_0] = 0xaa200000,
[o_DPHY_CAL_CON2_1] = 0xaa201000,
[o_DPHY_CAL_CON2_2] = 0xaa250000,
[o_DPHY_CAL_CON2_3] = 0xaa251000,
[o_DPHY_CAL_CON2_4] = 0xaa270000,
[o_DPHY_CAL_CON2_5] = 0x44050000,
[o_DPHY_CAL_WR_PATTERN_CON4_0] = 0x55aa55aa,
[o_DPHY_CAL_WR_PATTERN_CON4_1] = 0x5555,
[o_DPHY_GNR_CON0_0] = 0x43005020,
[o_DPHY_GNR_CON0_1] = 0x43106024,
[o_DPHY_GNR_CON0_2] = 0x47106024,
[o_DPHY_GNR_CON0_3] = 0x47106016,
[o_DPHY_LP_CON0_0] = 0x400c,
[o_DPHY_LP_CON0_1] = 0x400f,
[o_DPHY_LP_CON0_2] = 0xf,
[o_DPHY_MDLL_CON0_0] = 0x10000130,
[o_DPHY_MDLL_CON0_1] = 0x10000150,
[o_DPHY_MDLL_CON0_2] = 0x10000170,
[o_DPHY_MDLL_CON0_3] = 0x10800170,
[o_DPHY_OFFSETD_CON0_0] = 0x01000000,
[o_DPHY_OFFSETD_CON0_1] = 0x11000000,
[o_DPHY_ZQ_CON0_0] = 0xff807304,
[o_DPHY_ZQ_CON0_1] = 0xff807304,
[o_DPHY_ZQ_CON0_10] = 0xff847304,
[o_DPHY_ZQ_CON0_11] = 0xff847306,
[o_DPHY_ZQ_CON0_12] = 0xff047304,
[o_DPHY_ZQ_CON0_13] = 0xff807304,
[o_DPHY_ZQ_CON0_14] = 0xff807306,
[o_DPHY_ZQ_CON0_15] = 0xff847304,
[o_DPHY_ZQ_CON0_16] = 0xff847306,
[o_DPHY_ZQ_CON0_2] = 0xff807304,
[o_DPHY_ZQ_CON0_3] = 0xff047304,
[o_DPHY_ZQ_CON0_4] = 0xff007300,
[o_DPHY_ZQ_CON0_5] = 0xff007302,
[o_DPHY_ZQ_CON0_6] = 0xff047300,
[o_DPHY_ZQ_CON0_7] = 0xff047302,
[o_DPHY_ZQ_CON0_8] = 0xff807304,
[o_DPHY_ZQ_CON0_9] = 0xff807306,
[o_DPHY_ZQ_CON3_0] = 0x003f3f3f,
[o_DPHY_ZQ_CON3_1] = 0x003f3f3f,
[o_DPHY_ZQ_CON3_2] = 0x003f3f3f,
[o_DPHY_ZQ_CON3_3] = 0x003f3f3f,
[o_DPHY_ZQ_CON6_0] = 0x101,
[o_DPHY_ZQ_CON6_1] = 0x2020,
[o_DPHY_ZQ_CON6_2] = 0x2121,
[o_DPHY_ZQ_CON9_0] = 0x4040,
[o_DPHY_ZQ_CON9_1] = 0x5454,
[o_DPHY_ZQ_CON9_2] = 0x1414,
[o_DREX_INIT_TRAIN_CONFIG_0] = 0x0,
[o_DREX_INIT_TRAIN_CONFIG_2] = 0x2,
[o_DREX_INIT_TRAIN_CONFIG_3] = 0x4,
[o_DREX_INIT_TRAIN_CONTROL_0] = 0x0,
[o_DREX_INIT_TRAIN_CONTROL_1] = 0x1,
[o_DREX_PHYCONTROL0_0] = 0x80,
[o_DREX_PHYCONTROL0_1] = 0x88,
[o_DREX_PRECHCONFIG0_0] = 0x0,
[o_DREX_PRECHCONFIG0_1] = 0xf0000,
[o_DREX_TIMINGDATA0_0] = 0x6a408464,
[o_DREX_TIMINGDATA1_0] = 0x6a408464,
[o_Reserved_DDR_INIT_0] = 0xff,
[o_Reserved_DDR_INIT_1] = 0x82470300,
[o_Reserved_DDR_INIT_10] = 0x402844,
[o_Reserved_DDR_INIT_11] = 0x432323,
[o_Reserved_DDR_INIT_12] = 0x0,
[o_Reserved_DDR_INIT_13] = 0xc02844,
[o_Reserved_DDR_INIT_14] = 0x8c02844,
[o_Reserved_DDR_INIT_15] = 0x100,
[o_Reserved_DDR_INIT_16] = 0x1,
[o_Reserved_DDR_INIT_17] = 0xea201000,
[o_Reserved_DDR_INIT_18] = 0xfc7f9800,
[o_Reserved_DDR_INIT_19] = 0x55aa55aa,
[o_Reserved_DDR_INIT_2] = 0x82470310,
[o_Reserved_DDR_INIT_20] = 0x7f08004d,
[o_Reserved_DDR_INIT_3] = 0x1,
[o_Reserved_DDR_INIT_4] = 0x1,
[o_Reserved_DDR_INIT_5] = 0x274a,
[o_Reserved_DDR_INIT_6] = 0x23a5,
[o_Reserved_DDR_INIT_7] = 0x3370,
[o_Reserved_DDR_INIT_8] = 0x6330504,
[o_Reserved_DDR_INIT_9] = 0x6330504,
[o_PCIe_reg_75] = 0x55aa55aa,
[o_PCIe_reg_76] = 0x55aa55aa,
[o_PCIe_reg_77] = 0x33,
[o_PCIe_reg_78] = 0x80F00510,
[o_PCIe_reg_79] = 0x0,
[o_PCIe_reg_address_75] = 0x55aa55aa,
[o_PCIe_reg_address_76] = 0x8000,
[o_PCIe_reg_address_77] = 0x80F00500,
[o_PCIe_reg_address_78] = 0x3,
[o_PCIe_reg_address_79] = 0x542010c,
[o_SECURE_JTAG0] = 0x81f40306,
[o_SECURE_JTAG1] = 0x81f40316,
[o_SECURE_JTAG2] = 0x0,
[o_SECURE_JTAG3] = 0x00c3004f,
[o_SECURE_JTAG4] = 0x11,
[o_SECURE_JTAG5] = 0x3,
};
static inline uint32_t read_otp_wrapper(uint32_t offset)
{
if (offset < o_PCIe_reg_75)
return RD_REG(ABC_BASE_OTP_WRAPPER + 0x7000 + (offset * 4));
else if (offset < o_SECURE_JTAG0)
return RD_REG(ABC_BASE_OTP_WRAPPER + 0x7488 + ((offset - o_PCIe_reg_75) * 4));
else
return RD_REG(ABC_BASE_OTP_WRAPPER + 0x6000 + ((offset - o_SECURE_JTAG0) * 4));
}
static inline uint32_t read_otp_array(uint32_t offset)
{
return ddr_otp_values[offset];
}
#endif /* _AIRBRUSH_DDR_OTP_H_ */