Tom Rini | 83d290c | 2018-05-06 17:58:06 -0400 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0+ |
Phil Sutter | aefb8f4 | 2015-12-25 14:41:25 +0100 | [diff] [blame] | 2 | /* |
| 3 | * |
| 4 | * Copyright (C) 2015 Phil Sutter <phil@nwl.cc> |
Phil Sutter | aefb8f4 | 2015-12-25 14:41:25 +0100 | [diff] [blame] | 5 | */ |
| 6 | |
| 7 | #include <common.h> |
Simon Glass | 691d719 | 2020-05-10 11:40:02 -0600 | [diff] [blame] | 8 | #include <init.h> |
Phil Sutter | aefb8f4 | 2015-12-25 14:41:25 +0100 | [diff] [blame] | 9 | #include <miiphy.h> |
Simon Glass | 401d1c4 | 2020-10-30 21:38:53 -0600 | [diff] [blame] | 10 | #include <asm/global_data.h> |
Phil Sutter | aefb8f4 | 2015-12-25 14:41:25 +0100 | [diff] [blame] | 11 | #include <asm/io.h> |
| 12 | #include <asm/arch/cpu.h> |
| 13 | #include <asm/arch/soc.h> |
Simon Glass | cd93d62 | 2020-05-10 11:40:13 -0600 | [diff] [blame] | 14 | #include <linux/bitops.h> |
Phil Sutter | aefb8f4 | 2015-12-25 14:41:25 +0100 | [diff] [blame] | 15 | #include <linux/mbus.h> |
| 16 | |
| 17 | #include "../drivers/ddr/marvell/axp/ddr3_hw_training.h" |
| 18 | #include "../arch/arm/mach-mvebu/serdes/axp/high_speed_env_spec.h" |
| 19 | #include "../arch/arm/mach-mvebu/serdes/axp/board_env_spec.h" |
| 20 | |
| 21 | DECLARE_GLOBAL_DATA_PTR; |
| 22 | |
| 23 | /* GPP and MPP settings as found in mvBoardEnvSpec.c of Synology's U-Boot */ |
| 24 | |
| 25 | #define DS414_GPP_OUT_VAL_LOW (BIT(25) | BIT(30)) |
| 26 | #define DS414_GPP_OUT_VAL_MID (BIT(10) | BIT(15)) |
| 27 | #define DS414_GPP_OUT_VAL_HIGH (0) |
| 28 | |
| 29 | #define DS414_GPP_OUT_POL_LOW (0) |
| 30 | #define DS414_GPP_OUT_POL_MID (0) |
| 31 | #define DS414_GPP_OUT_POL_HIGH (0) |
| 32 | |
| 33 | #define DS414_GPP_OUT_ENA_LOW (~(BIT(25) | BIT(30))) |
| 34 | #define DS414_GPP_OUT_ENA_MID (~(BIT(10) | BIT(12) | \ |
| 35 | BIT(13) | BIT(14) | BIT(15))) |
| 36 | #define DS414_GPP_OUT_ENA_HIGH (~0) |
| 37 | |
| 38 | static const u32 ds414_mpp_control[] = { |
| 39 | 0x11111111, |
| 40 | 0x22221111, |
| 41 | 0x22222222, |
| 42 | 0x00000000, |
| 43 | 0x11110000, |
| 44 | 0x00004000, |
| 45 | 0x00000000, |
| 46 | 0x00000000, |
| 47 | 0x00000000 |
| 48 | }; |
| 49 | |
| 50 | /* DDR3 static MC configuration */ |
| 51 | |
| 52 | /* 1G_v1 (4x2Gbits) adapted by DS414 */ |
| 53 | MV_DRAM_MC_INIT syno_ddr3_b0_667_1g_v1[MV_MAX_DDR3_STATIC_SIZE] = { |
| 54 | {0x00001400, 0x73014A28}, /*DDR SDRAM Configuration Register */ |
| 55 | {0x00001404, 0x30000800}, /*Dunit Control Low Register */ |
| 56 | {0x00001408, 0x44148887}, /*DDR SDRAM Timing (Low) Register */ |
| 57 | {0x0000140C, 0x3AD83FEA}, /*DDR SDRAM Timing (High) Register */ |
| 58 | |
| 59 | {0x00001410, 0x14000000}, /*DDR SDRAM Address Control Register */ |
| 60 | |
| 61 | {0x00001414, 0x00000000}, /*DDR SDRAM Open Pages Control Register */ |
| 62 | {0x00001418, 0x00000e00}, /*DDR SDRAM Operation Register */ |
| 63 | {0x00001420, 0x00000004}, /*DDR SDRAM Extended Mode Register */ |
| 64 | {0x00001424, 0x0000F3FF}, /*Dunit Control High Register */ |
| 65 | {0x00001428, 0x000F8830}, /*Dunit Control High Register */ |
| 66 | {0x0000142C, 0x054C36F4}, /*Dunit Control High Register */ |
| 67 | {0x0000147C, 0x0000C671}, |
| 68 | |
| 69 | {0x000014a0, 0x00000001}, |
| 70 | {0x000014a8, 0x00000100}, /*2:1 */ |
| 71 | {0x00020220, 0x00000006}, |
| 72 | |
| 73 | {0x00001494, 0x00010000}, /*DDR SDRAM ODT Control (Low) Register */ |
| 74 | {0x00001498, 0x00000000}, /*DDR SDRAM ODT Control (High) Register */ |
| 75 | {0x0000149C, 0x00000001}, /*DDR Dunit ODT Control Register */ |
| 76 | |
| 77 | {0x000014C0, 0x192424C9}, /* DRAM address and Control Driving Strenght */ |
| 78 | {0x000014C4, 0x0AAA24C9}, /* DRAM Data and DQS Driving Strenght */ |
| 79 | |
| 80 | {0x000200e8, 0x3FFF0E01}, /* DO NOT Modify - Open Mbus Window - 2G - Mbus is required for the training sequence*/ |
| 81 | {0x00020184, 0x3FFFFFE0}, /* DO NOT Modify - Close fast path Window to - 2G */ |
| 82 | |
| 83 | {0x0001504, 0x3FFFFFE1}, /* CS0 Size */ |
| 84 | {0x000150C, 0x00000000}, /* CS1 Size */ |
| 85 | {0x0001514, 0x00000000}, /* CS2 Size */ |
| 86 | {0x000151C, 0x00000000}, /* CS3 Size */ |
| 87 | |
| 88 | {0x00001538, 0x00000009}, /*Read Data Sample Delays Register */ |
| 89 | {0x0000153C, 0x00000009}, /*Read Data Ready Delay Register */ |
| 90 | |
| 91 | {0x000015D0, 0x00000650}, /*MR0 */ |
| 92 | {0x000015D4, 0x00000044}, /*MR1 */ |
| 93 | {0x000015D8, 0x00000010}, /*MR2 */ |
| 94 | {0x000015DC, 0x00000000}, /*MR3 */ |
| 95 | |
| 96 | {0x000015E4, 0x00203c18}, /*ZQC Configuration Register */ |
| 97 | {0x000015EC, 0xF800A225}, /*DDR PHY */ |
| 98 | |
| 99 | {0x0, 0x0} |
| 100 | }; |
| 101 | |
| 102 | MV_DRAM_MODES ds414_ddr_modes[MV_DDR3_MODES_NUMBER] = { |
| 103 | {"ds414_1333-667", 0x3, 0x5, 0x0, A0, syno_ddr3_b0_667_1g_v1, NULL}, |
| 104 | }; |
| 105 | |
| 106 | extern MV_SERDES_CHANGE_M_PHY serdes_change_m_phy[]; |
| 107 | |
| 108 | MV_BIN_SERDES_CFG ds414_serdes_cfg[] = { |
| 109 | { MV_PEX_ROOT_COMPLEX, 0x02011111, 0x00000000, |
| 110 | { PEX_BUS_MODE_X4, PEX_BUS_MODE_X1, PEX_BUS_DISABLED, |
| 111 | PEX_BUS_DISABLED }, |
| 112 | 0x0040, serdes_change_m_phy |
| 113 | } |
| 114 | }; |
| 115 | |
| 116 | MV_DRAM_MODES *ddr3_get_static_ddr_mode(void) |
| 117 | { |
| 118 | return &ds414_ddr_modes[0]; |
| 119 | } |
| 120 | |
Stefan Roese | 0a59024 | 2019-04-08 14:51:49 +0200 | [diff] [blame] | 121 | MV_BIN_SERDES_CFG *board_serdes_cfg_get(void) |
Phil Sutter | aefb8f4 | 2015-12-25 14:41:25 +0100 | [diff] [blame] | 122 | { |
| 123 | return &ds414_serdes_cfg[0]; |
| 124 | } |
| 125 | |
| 126 | u8 board_sat_r_get(u8 dev_num, u8 reg) |
| 127 | { |
Stefan Roese | 0a59024 | 2019-04-08 14:51:49 +0200 | [diff] [blame] | 128 | return 0xf; /* All PEX ports support PCIe Gen2 */ |
Phil Sutter | aefb8f4 | 2015-12-25 14:41:25 +0100 | [diff] [blame] | 129 | } |
| 130 | |
| 131 | int board_early_init_f(void) |
| 132 | { |
| 133 | int i; |
| 134 | |
| 135 | /* Set GPP Out value */ |
| 136 | reg_write(GPP_DATA_OUT_REG(0), DS414_GPP_OUT_VAL_LOW); |
| 137 | reg_write(GPP_DATA_OUT_REG(1), DS414_GPP_OUT_VAL_MID); |
| 138 | reg_write(GPP_DATA_OUT_REG(2), DS414_GPP_OUT_VAL_HIGH); |
| 139 | |
| 140 | /* set GPP polarity */ |
| 141 | reg_write(GPP_DATA_IN_POL_REG(0), DS414_GPP_OUT_POL_LOW); |
| 142 | reg_write(GPP_DATA_IN_POL_REG(1), DS414_GPP_OUT_POL_MID); |
| 143 | reg_write(GPP_DATA_IN_POL_REG(2), DS414_GPP_OUT_POL_HIGH); |
| 144 | |
| 145 | /* Set GPP Out Enable */ |
| 146 | reg_write(GPP_DATA_OUT_EN_REG(0), DS414_GPP_OUT_ENA_LOW); |
| 147 | reg_write(GPP_DATA_OUT_EN_REG(1), DS414_GPP_OUT_ENA_MID); |
| 148 | reg_write(GPP_DATA_OUT_EN_REG(2), DS414_GPP_OUT_ENA_HIGH); |
| 149 | |
| 150 | for (i = 0; i < ARRAY_SIZE(ds414_mpp_control); i++) |
| 151 | reg_write(MPP_CONTROL_REG(i), ds414_mpp_control[i]); |
| 152 | |
| 153 | return 0; |
| 154 | } |
| 155 | |
| 156 | int board_init(void) |
| 157 | { |
| 158 | u32 pwr_mng_ctrl_reg; |
| 159 | |
| 160 | /* Adress of boot parameters */ |
| 161 | gd->bd->bi_boot_params = mvebu_sdram_bar(0) + 0x100; |
| 162 | |
| 163 | /* Gate unused clocks |
| 164 | * |
| 165 | * Note: Disabling unused PCIe lanes will hang PCI bus scan. |
| 166 | * Once this is resolved, bits 10-12, 26 and 27 can be |
| 167 | * unset here as well. |
| 168 | */ |
| 169 | pwr_mng_ctrl_reg = reg_read(POWER_MNG_CTRL_REG); |
| 170 | pwr_mng_ctrl_reg &= ~(BIT(0)); /* Audio */ |
| 171 | pwr_mng_ctrl_reg &= ~(BIT(1) | BIT(2)); /* GE3, GE2 */ |
| 172 | pwr_mng_ctrl_reg &= ~(BIT(14) | BIT(15)); /* SATA0 link and core */ |
| 173 | pwr_mng_ctrl_reg &= ~(BIT(16)); /* LCD */ |
| 174 | pwr_mng_ctrl_reg &= ~(BIT(17)); /* SDIO */ |
| 175 | pwr_mng_ctrl_reg &= ~(BIT(19) | BIT(20)); /* USB1 and USB2 */ |
| 176 | pwr_mng_ctrl_reg &= ~(BIT(29) | BIT(30)); /* SATA1 link and core */ |
| 177 | reg_write(POWER_MNG_CTRL_REG, pwr_mng_ctrl_reg); |
| 178 | |
| 179 | return 0; |
| 180 | } |
| 181 | |
| 182 | int checkboard(void) |
| 183 | { |
| 184 | puts("Board: DS414\n"); |
| 185 | |
| 186 | return 0; |
| 187 | } |