Lines Matching +full:check +full:- +full:dco
1 // SPDX-License-Identifier: Intel
82 tck = t_ck[mrc_params->ddr_speed]; /* Clock in picoseconds */ in prog_ddr_timing_control()
83 tcl = mrc_params->params.cl; /* CAS latency in clocks */ in prog_ddr_timing_control()
86 tras = MCEIL(mrc_params->params.ras, tck); in prog_ddr_timing_control()
88 /* Per JEDEC: tWR=15000ps DDR2/3 from 800-1600 */ in prog_ddr_timing_control()
91 twtr = MCEIL(mrc_params->params.wtr, tck); in prog_ddr_timing_control()
92 trrd = MCEIL(mrc_params->params.rrd, tck); in prog_ddr_timing_control()
94 tfaw = MCEIL(mrc_params->params.faw, tck); in prog_ddr_timing_control()
96 wl = 5 + mrc_params->ddr_speed; in prog_ddr_timing_control()
99 dtr0 |= mrc_params->ddr_speed; in prog_ddr_timing_control()
101 tmp1 = tcl - 5; in prog_ddr_timing_control()
102 dtr0 |= ((tcl - 5) << 12); in prog_ddr_timing_control()
104 dtr0 |= ((trp - 5) << 4); /* 5 bit DRAM Clock */ in prog_ddr_timing_control()
106 dtr0 |= ((trcd - 5) << 8); /* 5 bit DRAM Clock */ in prog_ddr_timing_control()
109 tmp2 = wl - 3; in prog_ddr_timing_control()
110 dtr1 |= (wl - 3); in prog_ddr_timing_control()
112 dtr1 |= ((wl + 4 + twr - 14) << 8); /* Change to tWTP */ in prog_ddr_timing_control()
114 dtr1 |= ((MMAX(trtp, 4) - 3) << 28); /* 4 bit DRAM Clock */ in prog_ddr_timing_control()
116 dtr1 |= ((trrd - 4) << 24); /* 4 bit DRAM Clock */ in prog_ddr_timing_control()
120 dtr1 |= ((tras - 14) << 20); /* 6 bit DRAM Clock */ in prog_ddr_timing_control()
122 dtr1 |= ((((tfaw + 1) >> 1) - 5) << 16);/* 4 bit DRAM Clock */ in prog_ddr_timing_control()
123 /* Set 4 Clock CAS to CAS delay (multi-burst) */ in prog_ddr_timing_control()
139 if (mrc_params->ddr_speed == DDRFREQ_800) { in prog_ddr_timing_control()
141 dtr3 |= ((tcl - 5 + 1) << 8); in prog_ddr_timing_control()
142 } else if (mrc_params->ddr_speed == DDRFREQ_1066) { in prog_ddr_timing_control()
144 dtr3 |= ((tcl - 5 + 1) << 8); in prog_ddr_timing_control()
148 dtr3 |= ((4 + wl + twtr - 11) << 13); in prog_ddr_timing_control()
151 if (mrc_params->ddr_speed == DDRFREQ_800) in prog_ddr_timing_control()
152 dtr3 |= ((MMAX(0, 1 - 1)) << 22); in prog_ddr_timing_control()
154 dtr3 |= ((MMAX(0, 2 - 1)) << 22); in prog_ddr_timing_control()
161 dtr4 |= ((1 + tmp1 - tmp2 + 2) << 8); in prog_ddr_timing_control()
163 dtr4 |= ((1 + tmp1 - tmp2 + 2) << 12); in prog_ddr_timing_control()
211 * impact, however simulator complains if enabled non-existing rank. in prog_decode_before_jedec()
214 if (mrc_params->rank_enables & 1) in prog_decode_before_jedec()
216 if (mrc_params->rank_enables & 2) in prog_decode_before_jedec()
242 mrc_params->rd_odt_value == 0 ? DRMC_ODTMODE : 0); in perform_ddr_reset()
259 /* For DDR3 --> 0 == 800, 1 == 1066, 2 == 1333 */ in ddrphy_init()
260 uint8_t speed = mrc_params->ddr_speed & 3; in ddrphy_init()
266 cas = mrc_params->params.cl; in ddrphy_init()
267 cwl = 5 + mrc_params->ddr_speed; in ddrphy_init()
280 if (mrc_params->channel_enables & (1 << ch)) { in ddrphy_init()
299 /* Initialize DQ01, DQ23, CMD, CLK-CTL, COMP modules */ in ddrphy_init()
304 if (mrc_params->channel_enables & (1 << ch)) { in ddrphy_init()
305 /* DQ01-DQ23 */ in ddrphy_init()
309 /* Analog MUX select - IO2xCLKSEL */ in ddrphy_init()
317 switch (mrc_params->rd_odt_value) { in ddrphy_init()
350 temp -= 0x01010101; in ddrphy_init()
353 temp -= 0x02020202; in ddrphy_init()
356 temp -= 0x03030303; in ddrphy_init()
359 temp -= 0x04040404; in ddrphy_init()
398 switch (mrc_params->rd_odt_value) { in ddrphy_init()
429 ((cas + 7) << 16) | ((cas - 4) << 8) | in ddrphy_init()
430 ((cwl - 2) << 0), 0x003f1f1f); in ddrphy_init()
435 ((cas + 7) << 16) | ((cas - 4) << 8) | in ddrphy_init()
436 ((cwl - 2) << 0), 0x003f1f1f); in ddrphy_init()
477 /* Per-Bit De-Skew Enable */ in ddrphy_init()
483 /* Per-Bit De-Skew Enable */ in ddrphy_init()
542 /* CLK-CTL */ in ddrphy_init()
561 * - DQ/DQS/DM RON: 32 Ohm in ddrphy_init()
562 * - CTRL/CMD RON: 27 Ohm in ddrphy_init()
563 * - CLK RON: 26 Ohm in ddrphy_init()
608 * - DQ/DQS/DM/CLK SR: 4V/ns, in ddrphy_init()
609 * - CTRL/CMD SR: 1.5V/ns in ddrphy_init()
842 if (mrc_params->rank_enables & (1 << rk)) { in ddrphy_init()
935 if (mrc_params->channel_enables & (1 << ch)) { in ddrphy_init()
936 /* DQ01-DQ23 */ in ddrphy_init()
958 /* CLK-CTL */ in ddrphy_init()
971 if (mrc_params->channel_enables & (1 << ch)) { in ddrphy_init()
972 /* DQ01-DQ23 */ in ddrphy_init()
994 /* CLK-CTL */ in ddrphy_init()
1007 if (mrc_params->channel_enables & (1 << ch)) { in ddrphy_init()
1008 /* DQ01-DQ23 */ in ddrphy_init()
1014 (mrc_params->channel_width == X16)) ? in ddrphy_init()
1059 if (mrc_params->channel_enables & (1 << ch)) { in ddrphy_init()
1192 if ((mrc_params->rank_enables & (1 << rank)) == 0) in perform_jedec_init()
1199 (mrc_params->rd_odt_value == 0 ? DRMC_ODTMODE : 0)); in perform_jedec_init()
1203 * BIT[15:11] --> Always "0" in perform_jedec_init()
1204 * BIT[10:09] --> Rtt_WR: want "Dynamic ODT Off" (0) in perform_jedec_init()
1205 * BIT[08] --> Always "0" in perform_jedec_init()
1206 * BIT[07] --> SRT: use sr_temp_range in perform_jedec_init()
1207 * BIT[06] --> ASR: want "Manual SR Reference" (0) in perform_jedec_init()
1208 * BIT[05:03] --> CWL: use oem_tCWL in perform_jedec_init()
1209 * BIT[02:00] --> PASR: want "Full Array" (0) in perform_jedec_init()
1212 wl = 5 + mrc_params->ddr_speed; in perform_jedec_init()
1213 emrs2_cmd |= ((wl - 5) << 9); in perform_jedec_init()
1214 emrs2_cmd |= (mrc_params->sr_temp_range << 13); in perform_jedec_init()
1218 * BIT[15:03] --> Always "0" in perform_jedec_init()
1219 * BIT[02] --> MPR: want "Normal Operation" (0) in perform_jedec_init()
1220 * BIT[01:00] --> MPR_Loc: want "Predefined Pattern" (0) in perform_jedec_init()
1226 * BIT[15:13] --> Always "0" in perform_jedec_init()
1227 * BIT[12:12] --> Qoff: want "Output Buffer Enabled" (0) in perform_jedec_init()
1228 * BIT[11:11] --> TDQS: want "Disabled" (0) in perform_jedec_init()
1229 * BIT[10:10] --> Always "0" in perform_jedec_init()
1230 * BIT[09,06,02] --> Rtt_nom: use rtt_nom_value in perform_jedec_init()
1231 * BIT[08] --> Always "0" in perform_jedec_init()
1232 * BIT[07] --> WR_LVL: want "Disabled" (0) in perform_jedec_init()
1233 * BIT[05,01] --> DIC: use ron_value in perform_jedec_init()
1234 * BIT[04:03] --> AL: additive latency want "0" (0) in perform_jedec_init()
1235 * BIT[00] --> DLL: want "Enable" (0) in perform_jedec_init()
1238 * 00 --> RZQ/6 (40ohm) in perform_jedec_init()
1239 * 01 --> RZQ/7 (34ohm) in perform_jedec_init()
1240 * 1* --> RESERVED in perform_jedec_init()
1243 * 000 --> Disabled in perform_jedec_init()
1244 * 001 --> RZQ/4 ( 60ohm) in perform_jedec_init()
1245 * 010 --> RZQ/2 (120ohm) in perform_jedec_init()
1246 * 011 --> RZQ/6 ( 40ohm) in perform_jedec_init()
1247 * 1** --> RESERVED in perform_jedec_init()
1252 if (mrc_params->ron_value == 0) in perform_jedec_init()
1257 if (mrc_params->rtt_nom_value == 0) in perform_jedec_init()
1259 else if (mrc_params->rtt_nom_value == 1) in perform_jedec_init()
1261 else if (mrc_params->rtt_nom_value == 2) in perform_jedec_init()
1265 mrc_params->mrs1 = emrs1_cmd >> 6; in perform_jedec_init()
1269 * BIT[15:13] --> Always "0" in perform_jedec_init()
1270 * BIT[12] --> PPD: for Quark (1) in perform_jedec_init()
1271 * BIT[11:09] --> WR: use oem_tWR in perform_jedec_init()
1272 * BIT[08] --> DLL: want "Reset" (1, self clearing) in perform_jedec_init()
1273 * BIT[07] --> MODE: want "Normal" (0) in perform_jedec_init()
1274 * BIT[06:04,02] --> CL: use oem_tCAS in perform_jedec_init()
1275 * BIT[03] --> RD_BURST_TYPE: want "Interleave" (1) in perform_jedec_init()
1276 * BIT[01:00] --> BL: want "8 Fixed" (0) in perform_jedec_init()
1278 * 0 --> 16 in perform_jedec_init()
1279 * 1 --> 5 in perform_jedec_init()
1280 * 2 --> 6 in perform_jedec_init()
1281 * 3 --> 7 in perform_jedec_init()
1282 * 4 --> 8 in perform_jedec_init()
1283 * 5 --> 10 in perform_jedec_init()
1284 * 6 --> 12 in perform_jedec_init()
1285 * 7 --> 14 in perform_jedec_init()
1288 * BIT[06:04] use oem_tCAS-4 in perform_jedec_init()
1294 tck = t_ck[mrc_params->ddr_speed]; in perform_jedec_init()
1295 /* Per JEDEC: tWR=15000ps DDR2/3 from 800-1600 */ in perform_jedec_init()
1297 mrs0_cmd |= ((twr - 4) << 15); in perform_jedec_init()
1301 if ((mrc_params->rank_enables & (1 << rank)) == 0) in perform_jedec_init()
1333 u32 dco; in set_ddr_init_complete() local
1337 dco = msg_port_read(MEM_CTLR, DCO); in set_ddr_init_complete()
1338 dco &= ~DCO_PMICTL; in set_ddr_init_complete()
1339 dco |= DCO_IC; in set_ddr_init_complete()
1340 msg_port_write(MEM_CTLR, DCO, dco); in set_ddr_init_complete()
1354 const struct mrc_timings *mt = &mrc_params->timings; in restore_timings()
1359 set_rcvn(ch, rk, bl, mt->rcvn[ch][rk][bl]); in restore_timings()
1360 set_rdqs(ch, rk, bl, mt->rdqs[ch][rk][bl]); in restore_timings()
1361 set_wdqs(ch, rk, bl, mt->wdqs[ch][rk][bl]); in restore_timings()
1362 set_wdq(ch, rk, bl, mt->wdq[ch][rk][bl]); in restore_timings()
1365 set_vref(ch, bl, mt->vref[ch][bl]); in restore_timings()
1368 set_wctl(ch, rk, mt->wctl[ch][rk]); in restore_timings()
1370 set_wcmd(ch, mt->wcmd[ch]); in restore_timings()
1407 uint8_t bl_divisor = (mrc_params->channel_width == X16) ? 2 : 1; in rcvn_cal()
1446 if (mrc_params->channel_enables & (1 << ch)) { in rcvn_cal()
1449 if (mrc_params->rank_enables & (1 << rk)) { in rcvn_cal()
1457 /* et hard-coded timing values */ in rcvn_cal()
1471 /* 1x CLK domain timing is cas-4 */ in rcvn_cal()
1491 delay[bl] -= FULL_CLK; in rcvn_cal()
1554 uint8_t bl_divisor = (mrc_params->channel_width == X16) ? 2 : 1; in wr_level()
1573 * where non-static copies the data onto the stack every time this in wr_level()
1592 if (mrc_params->channel_enables & (1 << ch)) { in wr_level()
1595 if (mrc_params->rank_enables & (1 << rk)) { in wr_level()
1605 set_wdq(ch, rk, bl, ddr_wdqs[PLATFORM_ID] - QRTR_CLK); in wr_level()
1632 * Enable Sandy Bridge Mode (WDQ Tri-State) & in wr_level()
1649 * CLK0 --> RK0 in wr_level()
1650 * CLK1 --> RK1 in wr_level()
1680 dram_init_command(DCMD_MRS1(rk, mrc_params->mrs1)); in wr_level()
1692 * check that we're on the correct clock edge in wr_level()
1696 mrc_params->hte_setup = 1; in wr_level()
1704 * (WDQ = WDQS - 32 PI) in wr_level()
1706 set_wdq(ch, rk, bl, (delay[bl] - QRTR_CLK)); in wr_level()
1717 mrc_params->hte_setup = 1; in wr_level()
1720 /* check for failures and margin the byte lane back 128 PI (1 CLK) */ in wr_level()
1724 delay[bl] -= FULL_CLK; in wr_level()
1726 /* program WDQ timings based on WDQS (WDQ = WDQS - 32 PI) */ in wr_level()
1727 set_wdq(ch, rk, bl, delay[bl] - QRTR_CLK); in wr_level()
1739 /* program WDQ timings based on WDQS (WDQ = WDQS - 32 PI) */ in wr_level()
1740 set_wdq(ch, rk, bl, final_delay[ch][bl] / num_ranks_enabled - QRTR_CLK); in wr_level()
1781 * NOTE: this algorithm assumes the eye curves have a one-to-one relationship,
1782 * meaning for each X the curve has only one Y and vice-a-versa.
1789 uint8_t bl_divisor = (mrc_params->channel_width == X16) ? 2 : 1; in rd_train()
1820 if (mrc_params->channel_enables & (1 << ch)) { in rd_train()
1822 if (mrc_params->rank_enables & (1 << rk)) { in rd_train()
1835 if (mrc_params->channel_enables & (1 << ch)) { in rd_train()
1837 if (mrc_params->rank_enables & (1 << rk)) { in rd_train()
1873 if (mrc_params->channel_enables & (0x1 << ch)) { in rd_train()
1875 if (mrc_params->rank_enables & in rd_train()
1891 mrc_params->hte_setup = 1; in rd_train()
1898 /* check for failures */ in rd_train()
1908 x_coordinate[R][side_y][ch][rk][bl] -= RDQS_STEP; in rd_train()
1910 /* check that we haven't closed the RDQS_EYE too much */ in rd_train()
1911 if ((x_coordinate[L][side_y][ch][rk][bl] > (RDQS_MAX - MIN_RDQS_EYE)) || in rd_train()
1922 y_coordinate[side_x][T][ch][bl] -= VREF_STEP; in rd_train()
1924 /* check that we haven't closed the VREF_EYE too much */ in rd_train()
1925 if ((y_coordinate[side_x][B][ch][bl] > (VREF_MAX - MIN_VREF_EYE)) || in rd_train()
1957 if (mrc_params->channel_enables & (1 << ch)) { in rd_train()
1959 if (mrc_params->rank_enables & (1 << rk)) { in rd_train()
1966 "RDQS T/B eye rank%d lane%d : %d-%d %d-%d\n", in rd_train()
1982 "VREF R/L eye lane%d : %d-%d %d-%d\n", in rd_train()
2002 /* perform an eye check */ in rd_train()
2007 /* update the settings for the eye check */ in rd_train()
2009 if (mrc_params->channel_enables & (1 << ch)) { in rd_train()
2011 if (mrc_params->rank_enables & (1 << rk)) { in rd_train()
2014 set_rdqs(ch, rk, bl, x_center[ch][rk][bl] - (MIN_RDQS_EYE / 2)); in rd_train()
2019 set_vref(ch, bl, y_center[ch][bl] - (MIN_VREF_EYE / 2)); in rd_train()
2029 mrc_params->hte_setup = 1; in rd_train()
2031 /* check the eye */ in rd_train()
2044 if (mrc_params->channel_enables & (1 << ch)) { in rd_train()
2046 if (mrc_params->rank_enables & (1 << rk)) { in rd_train()
2077 * in WR_LVL) +/- 32 PIs (+/- 1/4 CLK) and collapse the eye until all data
2087 uint8_t bl_divisor = (mrc_params->channel_width == X16) ? 2 : 1; in wr_train()
2112 if (mrc_params->channel_enables & (1 << ch)) { in wr_train()
2114 if (mrc_params->rank_enables & (1 << rk)) { in wr_train()
2127 if (mrc_params->channel_enables & (1 << ch)) { in wr_train()
2129 if (mrc_params->rank_enables & (1 << rk)) { in wr_train()
2135 * WDQ = (WDQS - QRTR_CLK) in wr_train()
2136 * +/- QRTR_CLK in wr_train()
2138 temp = get_wdqs(ch, rk, bl) - QRTR_CLK; in wr_train()
2139 delay[L][ch][rk][bl] = temp - QRTR_CLK; in wr_train()
2165 if (mrc_params->channel_enables & (1 << ch)) { in wr_train()
2167 if (mrc_params->rank_enables & in wr_train()
2181 if (mrc_params->channel_enables & (1 << ch)) { in wr_train()
2183 if (mrc_params->rank_enables & in wr_train()
2189 mrc_params->hte_setup = 1; in wr_train()
2191 /* check the settings */ in wr_train()
2195 /* check for failures */ in wr_train()
2204 delay[R][ch][rk][bl] -= WDQ_STEP; in wr_train()
2206 /* check for algorithm failure */ in wr_train()
2235 if (mrc_params->channel_enables & (1 << ch)) { in wr_train()
2237 if (mrc_params->rank_enables & (1 << rk)) { in wr_train()
2244 "WDQ eye rank%d lane%d : %d-%d\n", in wr_train()
2277 struct mrc_timings *mt = &mrc_params->timings; in store_timings()
2282 mt->rcvn[ch][rk][bl] = get_rcvn(ch, rk, bl); in store_timings()
2283 mt->rdqs[ch][rk][bl] = get_rdqs(ch, rk, bl); in store_timings()
2284 mt->wdqs[ch][rk][bl] = get_wdqs(ch, rk, bl); in store_timings()
2285 mt->wdq[ch][rk][bl] = get_wdq(ch, rk, bl); in store_timings()
2288 mt->vref[ch][bl] = get_vref(ch, bl); in store_timings()
2291 mt->wctl[ch][rk] = get_wctl(ch, rk); in store_timings()
2294 mt->wcmd[ch] = get_wcmd(ch); in store_timings()
2298 mt->ddr_speed = mrc_params->ddr_speed; in store_timings()
2310 if (mrc_params->scrambling_enables == 0) in enable_scrambling()
2316 lfsr = mrc_params->timings.scrambler_seed; in enable_scrambling()
2318 if (mrc_params->boot_mode == BM_COLD) { in enable_scrambling()
2341 mrc_params->timings.scrambler_seed = lfsr; in enable_scrambling()
2374 dpmc0 |= (mrc_params->power_down_disable << 25); in prog_ddr_control()
2381 /* CMDTRIST = 2h - CMD/ADDR are tristated when no valid command */ in prog_ddr_control()
2394 u32 dco; in prog_dra_drb() local
2395 u8 density = mrc_params->params.density; in prog_dra_drb()
2399 dco = msg_port_read(MEM_CTLR, DCO); in prog_dra_drb()
2400 dco &= ~DCO_IC; in prog_dra_drb()
2401 msg_port_write(MEM_CTLR, DCO, dco); in prog_dra_drb()
2404 if (mrc_params->rank_enables & 1) in prog_dra_drb()
2406 if (mrc_params->rank_enables & 2) in prog_dra_drb()
2408 if (mrc_params->dram_width == X16) { in prog_dra_drb()
2420 drp |= ((density - 1) << 6); in prog_dra_drb()
2421 drp |= ((density - 1) << 11); in prog_dra_drb()
2424 drp |= (mrc_params->address_mode << 14); in prog_dra_drb()
2428 dco &= ~DCO_PMICTL; in prog_dra_drb()
2429 dco |= DCO_IC; in prog_dra_drb()
2430 msg_port_write(MEM_CTLR, DCO, dco); in prog_dra_drb()
2459 drfc |= (mrc_params->refresh_rate << 12); in change_refresh_period()
2476 * Configure DDRPHY for Auto-Refresh, Periodic Compensations,
2477 * Dynamic Diff-Amp, ZQSPERIOD, Auto-Precharge, CKE Power-Down
2490 * Enable Auto-Refresh, Periodic Compensations, Dynamic Diff-Amp, in set_auto_refresh()
2491 * ZQSPERIOD, Auto-Precharge, CKE Power-Down in set_auto_refresh()
2494 if (mrc_params->channel_enables & (1 << channel)) { in set_auto_refresh()
2499 switch (mrc_params->rd_odt_value) { in set_auto_refresh()
2526 if (mrc_params->rank_enables & (1 << rank)) in set_auto_refresh()
2549 if (mrc_params->ecc_enables == 0) in ecc_enable()
2571 mrc_params->mem_size -= mrc_params->mem_size / 8; in ecc_enable()
2574 if (mrc_params->boot_mode != BM_S3) { in ecc_enable()
2585 * if error detected it is indicated in mrc_params->status
2598 mrc_params->status = ((result == 0) ? MRC_SUCCESS : MRC_E_MEMTEST); in memory_test()
2605 u32 dco; in lock_registers() local
2609 dco = msg_port_read(MEM_CTLR, DCO); in lock_registers()
2610 dco &= ~(DCO_PMICTL | DCO_PMIDIS); in lock_registers()
2611 dco |= (DCO_DRPLOCK | DCO_CPGCLOCK); in lock_registers()
2612 msg_port_write(MEM_CTLR, DCO, dco); in lock_registers()