/* * This file is part of the coreboot project. * * Copyright (C) 2016 Marvell, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include #include #include #include #include #include void sdram_init(struct mvmap2315_sdram_params *sdram_params) { printk(BIOS_DEBUG, "Entering %s\n", __func__); write32(&mvmap2315_dphy0->dphy_dll_ctrl_0, sdram_params->dphy_params[0]); write32(&mvmap2315_dphy0->dphy_dll_ctrl0, sdram_params->dphy_params[1]); write32(&mvmap2315_dphy0->dphy_dll_ctrl0, sdram_params->dphy_params[2]); write32(&mvmap2315_dphy1->dphy_dll_ctrl_0, sdram_params->dphy_params[3]); write32(&mvmap2315_dphy1->dphy_dll_ctrl0, sdram_params->dphy_params[4]); write32(&mvmap2315_dphy1->dphy_dll_ctrl0, sdram_params->dphy_params[5]); write32(&mvmap2315_dphy2->dphy_dll_ctrl_0, sdram_params->dphy_params[6]); write32(&mvmap2315_dphy2->dphy_dll_ctrl0, sdram_params->dphy_params[7]); write32(&mvmap2315_dphy2->dphy_dll_ctrl0, sdram_params->dphy_params[8]); write32(&mvmap2315_dphy3->dphy_dll_ctrl_0, sdram_params->dphy_params[9]); write32(&mvmap2315_dphy3->dphy_dll_ctrl0, sdram_params->dphy_params[10]); write32(&mvmap2315_dphy3->dphy_dll_ctrl0, sdram_params->dphy_params[11]); write32(&mvmap2315_dphy0->dphy_dll_ctrl0, sdram_params->dphy_params[12]); write32(&mvmap2315_dphy0->dphy_dll_ctrl0, sdram_params->dphy_params[13]); write32(&mvmap2315_dphy0->dphy_dfi_ctrl2, sdram_params->dphy_params[14]); write32(&mvmap2315_dphy1->dphy_dll_ctrl0, sdram_params->dphy_params[15]); write32(&mvmap2315_dphy1->dphy_dll_ctrl0, sdram_params->dphy_params[16]); write32(&mvmap2315_dphy1->dphy_dfi_ctrl2, sdram_params->dphy_params[17]); write32(&mvmap2315_dphy2->dphy_dll_ctrl0, sdram_params->dphy_params[18]); write32(&mvmap2315_dphy2->dphy_dll_ctrl0, sdram_params->dphy_params[19]); write32(&mvmap2315_dphy2->dphy_dfi_ctrl2, sdram_params->dphy_params[20]); write32(&mvmap2315_dphy3->dphy_dll_ctrl0, sdram_params->dphy_params[21]); write32(&mvmap2315_dphy3->dphy_dll_ctrl0, sdram_params->dphy_params[22]); write32(&mvmap2315_dphy3->dphy_dfi_ctrl2, sdram_params->dphy_params[23]); write32(&mvmap2315_dphy0->dphy_dfi_ctrl4, sdram_params->dphy_params[24]); write32(&mvmap2315_dphy0->dphy_dfi_ctrl4, sdram_params->dphy_params[25]); write32(&mvmap2315_dphy0->dphy_dfi_ctrl4, sdram_params->dphy_params[26]); write32(&mvmap2315_dphy0->dphy_dfi_ctrl4, sdram_params->dphy_params[27]); write32(&mvmap2315_dphy1->dphy_dfi_ctrl4, sdram_params->dphy_params[28]); write32(&mvmap2315_dphy1->dphy_dfi_ctrl4, sdram_params->dphy_params[29]); write32(&mvmap2315_dphy1->dphy_dfi_ctrl4, sdram_params->dphy_params[30]); write32(&mvmap2315_dphy1->dphy_dfi_ctrl4, sdram_params->dphy_params[31]); write32(&mvmap2315_dphy2->dphy_dfi_ctrl4, sdram_params->dphy_params[32]); write32(&mvmap2315_dphy2->dphy_dfi_ctrl4, sdram_params->dphy_params[33]); write32(&mvmap2315_dphy2->dphy_dfi_ctrl4, sdram_params->dphy_params[34]); write32(&mvmap2315_dphy2->dphy_dfi_ctrl4, sdram_params->dphy_params[35]); write32(&mvmap2315_dphy3->dphy_dfi_ctrl4, sdram_params->dphy_params[36]); write32(&mvmap2315_dphy3->dphy_dfi_ctrl4, sdram_params->dphy_params[37]); write32(&mvmap2315_dphy3->dphy_dfi_ctrl4, sdram_params->dphy_params[38]); write32(&mvmap2315_dphy3->dphy_dfi_ctrl4, sdram_params->dphy_params[39]); write32(&mvmap2315_mc->ch0_mc_config_cs0, sdram_params->mc_params[0]); write32(&mvmap2315_mc->ch1_mc_config_cs0, sdram_params->mc_params[1]); write32(&mvmap2315_mc->ch2_mc_config_cs0, sdram_params->mc_params[2]); write32(&mvmap2315_mc->ch3_mc_config_cs0, sdram_params->mc_params[3]); write32(&mvmap2315_mc->ch0_mc_config_cs1, sdram_params->mc_params[4]); write32(&mvmap2315_mc->ch1_mc_config_cs1, sdram_params->mc_params[5]); write32(&mvmap2315_mc->ch2_mc_config_cs1, sdram_params->mc_params[6]); write32(&mvmap2315_mc->ch3_mc_config_cs1, sdram_params->mc_params[7]); write32(&mvmap2315_mc->ch0_dram_config_4, sdram_params->mc_params[8]); write32(&mvmap2315_mc->ch1_dram_config_4, sdram_params->mc_params[9]); write32(&mvmap2315_mc->ch2_dram_config_4, sdram_params->mc_params[10]); write32(&mvmap2315_mc->ch3_dram_config_4, sdram_params->mc_params[11]); write32(&mvmap2315_mc->ch0_dram_config_5_cs0, sdram_params->mc_params[12]); write32(&mvmap2315_mc->ch1_dram_config_5_cs0, sdram_params->mc_params[13]); write32(&mvmap2315_mc->ch2_dram_config_5_cs0, sdram_params->mc_params[14]); write32(&mvmap2315_mc->ch3_dram_config_5_cs0, sdram_params->mc_params[15]); write32(&mvmap2315_mc->ch0_dram_config_5_cs1, sdram_params->mc_params[16]); write32(&mvmap2315_mc->ch1_dram_config_5_cs1, sdram_params->mc_params[17]); write32(&mvmap2315_mc->ch2_dram_config_5_cs1, sdram_params->mc_params[18]); write32(&mvmap2315_mc->ch3_dram_config_5_cs1, sdram_params->mc_params[19]); write32(&mvmap2315_mc->mmap0_high_ch0, sdram_params->mc_params[20]); write32(&mvmap2315_mc->mmap0_low_ch0, sdram_params->mc_params[21]); write32(&mvmap2315_mc->mmap0_high_ch1, sdram_params->mc_params[22]); write32(&mvmap2315_mc->mmap0_low_ch1, sdram_params->mc_params[23]); write32(&mvmap2315_mc->mmap0_high_ch2, sdram_params->mc_params[24]); write32(&mvmap2315_mc->mmap0_low_ch2, sdram_params->mc_params[25]); write32(&mvmap2315_mc->mmap0_high_ch3, sdram_params->mc_params[26]); write32(&mvmap2315_mc->mmap0_low_ch3, sdram_params->mc_params[27]); write32(&mvmap2315_mc->mmap1_high_ch0, sdram_params->mc_params[28]); write32(&mvmap2315_mc->mmap1_low_ch0, sdram_params->mc_params[29]); write32(&mvmap2315_mc->mmap1_high_ch1, sdram_params->mc_params[30]); write32(&mvmap2315_mc->mmap1_low_ch1, sdram_params->mc_params[31]); write32(&mvmap2315_mc->mmap1_high_ch2, sdram_params->mc_params[32]); write32(&mvmap2315_mc->mmap1_low_ch2, sdram_params->mc_params[33]); write32(&mvmap2315_mc->mmap1_high_ch3, sdram_params->mc_params[34]); write32(&mvmap2315_mc->mmap1_low_ch3, sdram_params->mc_params[35]); write32(&mvmap2315_mc->ch0_precharge_timing, sdram_params->mc_params[36]); write32(&mvmap2315_mc->ch1_precharge_timing, sdram_params->mc_params[37]); write32(&mvmap2315_mc->ch2_precharge_timing, sdram_params->mc_params[38]); write32(&mvmap2315_mc->ch3_precharge_timing, sdram_params->mc_params[39]); write32(&mvmap2315_mc->ch0_act_timing, sdram_params->mc_params[40]); write32(&mvmap2315_mc->ch1_act_timing, sdram_params->mc_params[41]); write32(&mvmap2315_mc->ch2_act_timing, sdram_params->mc_params[42]); write32(&mvmap2315_mc->ch3_act_timing, sdram_params->mc_params[43]); write32(&mvmap2315_mc->ch0_cas_ras_timing_0, sdram_params->mc_params[44]); write32(&mvmap2315_mc->ch1_cas_ras_timing_0, sdram_params->mc_params[45]); write32(&mvmap2315_mc->ch2_cas_ras_timing_0, sdram_params->mc_params[46]); write32(&mvmap2315_mc->ch3_cas_ras_timing_0, sdram_params->mc_params[47]); write32(&mvmap2315_mc->ch0_cas_ras_timing_1, sdram_params->mc_params[48]); write32(&mvmap2315_mc->ch1_cas_ras_timing_1, sdram_params->mc_params[49]); write32(&mvmap2315_mc->ch2_cas_ras_timing_1, sdram_params->mc_params[50]); write32(&mvmap2315_mc->ch3_cas_ras_timing_1, sdram_params->mc_params[51]); write32(&mvmap2315_mc->ch0_mrs_timing, sdram_params->mc_params[52]); write32(&mvmap2315_mc->ch1_mrs_timing, sdram_params->mc_params[53]); write32(&mvmap2315_mc->ch2_mrs_timing, sdram_params->mc_params[54]); write32(&mvmap2315_mc->ch3_mrs_timing, sdram_params->mc_params[55]); write32(&mvmap2315_mc->ch0_ddr_init_timing_control_0, sdram_params->mc_params[56]); write32(&mvmap2315_mc->ch0_ddr_init_timing_control_1, sdram_params->mc_params[57]); write32(&mvmap2315_mc->ch0_ddr_init_timing_control_2, sdram_params->mc_params[58]); write32(&mvmap2315_mc->ch1_ddr_init_timing_control_0, sdram_params->mc_params[59]); write32(&mvmap2315_mc->ch1_ddr_init_timing_control_1, sdram_params->mc_params[60]); write32(&mvmap2315_mc->ch1_ddr_init_timing_control_2, sdram_params->mc_params[61]); write32(&mvmap2315_mc->ch2_ddr_init_timing_control_0, sdram_params->mc_params[62]); write32(&mvmap2315_mc->ch2_ddr_init_timing_control_1, sdram_params->mc_params[63]); write32(&mvmap2315_mc->ch2_ddr_init_timing_control_2, sdram_params->mc_params[64]); write32(&mvmap2315_mc->ch3_ddr_init_timing_control_0, sdram_params->mc_params[65]); write32(&mvmap2315_mc->ch3_ddr_init_timing_control_1, sdram_params->mc_params[66]); write32(&mvmap2315_mc->ch3_ddr_init_timing_control_2, sdram_params->mc_params[67]); write32(&mvmap2315_mc->ch0_off_spec_timing_0, sdram_params->mc_params[68]); write32(&mvmap2315_mc->ch1_off_spec_timing_0, sdram_params->mc_params[69]); write32(&mvmap2315_mc->ch2_off_spec_timing_0, sdram_params->mc_params[70]); write32(&mvmap2315_mc->ch3_off_spec_timing_0, sdram_params->mc_params[71]); write32(&mvmap2315_mc->ch0_off_spec_timing_1, sdram_params->mc_params[72]); write32(&mvmap2315_mc->ch1_off_spec_timing_1, sdram_params->mc_params[73]); write32(&mvmap2315_mc->ch2_off_spec_timing_1, sdram_params->mc_params[74]); write32(&mvmap2315_mc->ch3_off_spec_timing_1, sdram_params->mc_params[75]); write32(&mvmap2315_mc->ch0_dram_read_timing, sdram_params->mc_params[76]); write32(&mvmap2315_mc->ch1_dram_read_timing, sdram_params->mc_params[77]); write32(&mvmap2315_mc->ch2_dram_read_timing, sdram_params->mc_params[78]); write32(&mvmap2315_mc->ch3_dram_read_timing, sdram_params->mc_params[79]); write32(&mvmap2315_mc->ch0_refresh_timing, sdram_params->mc_params[80]); write32(&mvmap2315_mc->ch1_refresh_timing, sdram_params->mc_params[81]); write32(&mvmap2315_mc->ch2_refresh_timing, sdram_params->mc_params[82]); write32(&mvmap2315_mc->ch3_refresh_timing, sdram_params->mc_params[83]); write32(&mvmap2315_mc->ch0_selfrefresh_timing_0, sdram_params->mc_params[84]); write32(&mvmap2315_mc->ch1_selfrefresh_timing_0, sdram_params->mc_params[85]); write32(&mvmap2315_mc->ch2_selfrefresh_timing_0, sdram_params->mc_params[86]); write32(&mvmap2315_mc->ch3_selfrefresh_timing_0, sdram_params->mc_params[87]); write32(&mvmap2315_mc->ch0_powerdown_timing_0, sdram_params->mc_params[88]); write32(&mvmap2315_mc->ch1_powerdown_timing_0, sdram_params->mc_params[89]); write32(&mvmap2315_mc->ch2_powerdown_timing_0, sdram_params->mc_params[90]); write32(&mvmap2315_mc->ch3_powerdown_timing_0, sdram_params->mc_params[91]); write32(&mvmap2315_mc->ch0_odt_control_1, sdram_params->mc_params[92]); write32(&mvmap2315_mc->ch1_odt_control_1, sdram_params->mc_params[93]); write32(&mvmap2315_mc->ch2_odt_control_1, sdram_params->mc_params[94]); write32(&mvmap2315_mc->ch3_odt_control_1, sdram_params->mc_params[95]); write32(&mvmap2315_mc->ch0_odt_control_2, sdram_params->mc_params[96]); write32(&mvmap2315_mc->ch1_odt_control_2, sdram_params->mc_params[97]); write32(&mvmap2315_mc->ch2_odt_control_2, sdram_params->mc_params[98]); write32(&mvmap2315_mc->ch3_odt_control_2, sdram_params->mc_params[99]); write32(&mvmap2315_mc->ch0_dram_config_1, sdram_params->mc_params[100]); write32(&mvmap2315_mc->ch1_dram_config_1, sdram_params->mc_params[101]); write32(&mvmap2315_mc->ch2_dram_config_1, sdram_params->mc_params[102]); write32(&mvmap2315_mc->ch3_dram_config_1, sdram_params->mc_params[103]); write32(&mvmap2315_mc->mc_control_0, sdram_params->mc_params[104]); write32(&mvmap2315_mc->ch0_mc_control_2, sdram_params->mc_params[105]); write32(&mvmap2315_mc->ch1_mc_control_2, sdram_params->mc_params[106]); write32(&mvmap2315_mc->ch2_mc_control_2, sdram_params->mc_params[107]); write32(&mvmap2315_mc->ch3_mc_control_2, sdram_params->mc_params[108]); write32(&mvmap2315_mc->ch0_dram_config_2, sdram_params->mc_params[109]); write32(&mvmap2315_mc->ch1_dram_config_2, sdram_params->mc_params[110]); write32(&mvmap2315_mc->ch2_dram_config_2, sdram_params->mc_params[111]); write32(&mvmap2315_mc->ch3_dram_config_2, sdram_params->mc_params[112]); write32(&mvmap2315_dphy0->dphy_dfi_ctrl0, sdram_params->dphy_params[40]); write32(&mvmap2315_dphy0->dphy_dfi_ctrl0, sdram_params->dphy_params[41]); write32(&mvmap2315_dphy0->dphy_dq_pad_ctrl0, sdram_params->dphy_params[42]); write32(&mvmap2315_dphy0->dphy_dq_pad_ctrl0, sdram_params->dphy_params[43]); write32(&mvmap2315_dphy0->dphy_dq_pad_ctrl2, sdram_params->dphy_params[44]); write32(&mvmap2315_dphy0->dphy_dq_pad_ctrl2, sdram_params->dphy_params[45]); write32(&mvmap2315_dphy0->dphy_adcm_pad_ctrl2, sdram_params->dphy_params[46]); write32(&mvmap2315_dphy0->dphy_adcm_pad_ctrl2, sdram_params->dphy_params[47]); write32(&mvmap2315_dphy1->dphy_dfi_ctrl0, sdram_params->dphy_params[48]); write32(&mvmap2315_dphy1->dphy_dfi_ctrl0, sdram_params->dphy_params[49]); write32(&mvmap2315_dphy1->dphy_dq_pad_ctrl0, sdram_params->dphy_params[50]); write32(&mvmap2315_dphy1->dphy_dq_pad_ctrl0, sdram_params->dphy_params[51]); write32(&mvmap2315_dphy1->dphy_dq_pad_ctrl2, sdram_params->dphy_params[52]); write32(&mvmap2315_dphy1->dphy_dq_pad_ctrl2, sdram_params->dphy_params[53]); write32(&mvmap2315_dphy1->dphy_adcm_pad_ctrl2, sdram_params->dphy_params[54]); write32(&mvmap2315_dphy1->dphy_adcm_pad_ctrl2, sdram_params->dphy_params[55]); write32(&mvmap2315_dphy2->dphy_dfi_ctrl0, sdram_params->dphy_params[56]); write32(&mvmap2315_dphy2->dphy_dfi_ctrl0, sdram_params->dphy_params[57]); write32(&mvmap2315_dphy2->dphy_dq_pad_ctrl0, sdram_params->dphy_params[58]); write32(&mvmap2315_dphy2->dphy_dq_pad_ctrl0, sdram_params->dphy_params[59]); write32(&mvmap2315_dphy2->dphy_dq_pad_ctrl2, sdram_params->dphy_params[60]); write32(&mvmap2315_dphy2->dphy_dq_pad_ctrl2, sdram_params->dphy_params[61]); write32(&mvmap2315_dphy2->dphy_adcm_pad_ctrl2, sdram_params->dphy_params[62]); write32(&mvmap2315_dphy2->dphy_adcm_pad_ctrl2, sdram_params->dphy_params[63]); write32(&mvmap2315_dphy3->dphy_dfi_ctrl0, sdram_params->dphy_params[64]); write32(&mvmap2315_dphy3->dphy_dfi_ctrl0, sdram_params->dphy_params[65]); write32(&mvmap2315_dphy3->dphy_dq_pad_ctrl0, sdram_params->dphy_params[66]); write32(&mvmap2315_dphy3->dphy_dq_pad_ctrl0, sdram_params->dphy_params[67]); write32(&mvmap2315_dphy3->dphy_dq_pad_ctrl2, sdram_params->dphy_params[68]); write32(&mvmap2315_dphy3->dphy_dq_pad_ctrl2, sdram_params->dphy_params[69]); write32(&mvmap2315_dphy3->dphy_adcm_pad_ctrl2, sdram_params->dphy_params[70]); write32(&mvmap2315_dphy3->dphy_adcm_pad_ctrl2, sdram_params->dphy_params[71]); write32(&mvmap2315_mc->ch0_dfi_phy_control_1, sdram_params->mc_params[113]); write32(&mvmap2315_mc->ch1_dfi_phy_control_1, sdram_params->mc_params[114]); write32(&mvmap2315_mc->ch2_dfi_phy_control_1, sdram_params->mc_params[115]); write32(&mvmap2315_mc->ch3_dfi_phy_control_1, sdram_params->mc_params[116]); write32(&mvmap2315_dphy0->dphy_vref_ctrl0, sdram_params->dphy_params[72]); write32(&mvmap2315_dphy0->dphy_vref_ctrl0, sdram_params->dphy_params[73]); write32(&mvmap2315_dphy1->dphy_vref_ctrl0, sdram_params->dphy_params[74]); write32(&mvmap2315_dphy1->dphy_vref_ctrl0, sdram_params->dphy_params[75]); write32(&mvmap2315_dphy2->dphy_vref_ctrl0, sdram_params->dphy_params[76]); write32(&mvmap2315_dphy2->dphy_vref_ctrl0, sdram_params->dphy_params[77]); write32(&mvmap2315_dphy3->dphy_vref_ctrl0, sdram_params->dphy_params[78]); write32(&mvmap2315_dphy3->dphy_vref_ctrl0, sdram_params->dphy_params[79]); write32(&mvmap2315_mc->mc_pwr_ctl, sdram_params->mc_params[117]); write32(&mvmap2315_mc->user_command_0, sdram_params->mc_params[118]); while ((read32(&mvmap2315_mc->dram_status) & MVMAP2315_MC_DRAM_READY) != MVMAP2315_MC_DRAM_READY) ; write32(&mvmap2315_dphy0->dphy_qsg_ctrl0, sdram_params->dphy_params[80]); write32(&mvmap2315_dphy0->dphy_dq_pad_ctrl0, sdram_params->dphy_params[81]); write32(&mvmap2315_dphy0->dphy_qsg_ctrl0, sdram_params->dphy_params[82]); write32(&mvmap2315_dphy0->dphy_qsg_ctrl0, sdram_params->dphy_params[83]); write32(&mvmap2315_dphy0->dphy_qsg_ctrl0, sdram_params->dphy_params[84]); write32(&mvmap2315_dphy1->dphy_qsg_ctrl0, sdram_params->dphy_params[85]); write32(&mvmap2315_dphy1->dphy_dq_pad_ctrl0, sdram_params->dphy_params[86]); write32(&mvmap2315_dphy1->dphy_qsg_ctrl0, sdram_params->dphy_params[87]); write32(&mvmap2315_dphy1->dphy_qsg_ctrl0, sdram_params->dphy_params[88]); write32(&mvmap2315_dphy1->dphy_qsg_ctrl0, sdram_params->dphy_params[89]); write32(&mvmap2315_dphy2->dphy_qsg_ctrl0, sdram_params->dphy_params[90]); write32(&mvmap2315_dphy2->dphy_dq_pad_ctrl0, sdram_params->dphy_params[91]); write32(&mvmap2315_dphy2->dphy_qsg_ctrl0, sdram_params->dphy_params[92]); write32(&mvmap2315_dphy2->dphy_qsg_ctrl0, sdram_params->dphy_params[93]); write32(&mvmap2315_dphy2->dphy_qsg_ctrl0, sdram_params->dphy_params[94]); write32(&mvmap2315_dphy3->dphy_qsg_ctrl0, sdram_params->dphy_params[95]); write32(&mvmap2315_dphy3->dphy_dq_pad_ctrl0, sdram_params->dphy_params[96]); write32(&mvmap2315_dphy3->dphy_qsg_ctrl0, sdram_params->dphy_params[97]); write32(&mvmap2315_dphy3->dphy_qsg_ctrl0, sdram_params->dphy_params[98]); write32(&mvmap2315_dphy3->dphy_qsg_ctrl0, sdram_params->dphy_params[99]); write32(&mvmap2315_mc->user_command_1, sdram_params->mc_params[119]); write32(&mvmap2315_mc->user_command_1, sdram_params->mc_params[120]); write32(&mvmap2315_mc->user_command_1, sdram_params->mc_params[121]); printk(BIOS_DEBUG, "Exiting %s\n", __func__); } size_t sdram_size_mb(void) { return CONFIG_DRAM_SIZE_MB; }