blob: 25345756e03f4aa407d6179ce03b4419746eb03c [file] [log] [blame]
Angel Pons4b429832020-04-02 23:48:50 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Damien Zammit43a1f782015-08-19 15:16:59 +10002
3#ifndef __NORTHBRIDGE_INTEL_X4X_H__
4#define __NORTHBRIDGE_INTEL_X4X_H__
5
Arthur Heymansdc972e12019-11-12 08:35:05 +01006#include <stdint.h>
Angel Pons2a8ceef2020-09-15 12:23:45 +02007#include "memmap.h"
Arthur Heymans6190d0b2019-11-01 18:34:45 +01008
Damien Zammit43a1f782015-08-19 15:16:59 +10009/*
10 * D0:F0
11 */
Angel Ponsd1c590a2020-08-03 16:01:39 +020012#define HOST_BRIDGE PCI_DEV(0, 0, 0)
13
Angel Ponsfd190752020-09-15 12:38:17 +020014#include "registers/host_bridge.h"
Damien Zammit43a1f782015-08-19 15:16:59 +100015
16/*
17 * D1:F0 PEG
18 */
Angel Pons6fd9adb2020-09-15 12:34:36 +020019#define PEG_CAP 0xa2
20#define SLOTCAP 0xb4
21#define PEGLC 0xec
22#define D1F0_VCCAP 0x104
23#define D1F0_VC0RCTL 0x114
Damien Zammit43a1f782015-08-19 15:16:59 +100024
25/*
26 * Graphics frequencies
27 */
28#define GCFGC_PCIDEV PCI_DEV(0, 2, 0)
29#define GCFGC_OFFSET 0xf0
30#define GCFGC_CR_SHIFT 0
31#define GCFGC_CR_MASK (0xf << GCFGC_CR_SHIFT)
32#define GCFGC_CS_SHIFT 8
33#define GCFGC_CS_MASK (0xf << GCFGC_CS_SHIFT)
34#define GCFGC_CD_SHIFT 12
35#define GCFGC_CD_MASK (0x1 << GCFGC_CD_SHIFT)
36#define GCFGC_UPDATE_SHIFT 5
37#define GCFGC_UPDATE (0x1 << GCFGC_UPDATE_SHIFT)
38
39/*
40 * MCHBAR
41 */
42
Angel Pons6fd9adb2020-09-15 12:34:36 +020043#define MCHBAR8(x) (*((volatile u8 *)(DEFAULT_MCHBAR + (x))))
Arthur Heymans70a1dda2017-03-09 01:58:24 +010044#define MCHBAR16(x) (*((volatile u16 *)(DEFAULT_MCHBAR + (x))))
45#define MCHBAR32(x) (*((volatile u32 *)(DEFAULT_MCHBAR + (x))))
Angel Pons6fd9adb2020-09-15 12:34:36 +020046#define MCHBAR8_AND(x, and) (MCHBAR8(x) = MCHBAR8(x) & (and))
Felix Held6cd2c2f2018-07-29 18:04:14 +020047#define MCHBAR16_AND(x, and) (MCHBAR16(x) = MCHBAR16(x) & (and))
Felix Held6cd2c2f2018-07-29 18:04:14 +020048#define MCHBAR32_AND(x, and) (MCHBAR32(x) = MCHBAR32(x) & (and))
Angel Pons6fd9adb2020-09-15 12:34:36 +020049#define MCHBAR8_OR(x, or) (MCHBAR8(x) = MCHBAR8(x) | (or))
50#define MCHBAR16_OR(x, or) (MCHBAR16(x) = MCHBAR16(x) | (or))
Felix Held6cd2c2f2018-07-29 18:04:14 +020051#define MCHBAR32_OR(x, or) (MCHBAR32(x) = MCHBAR32(x) | (or))
Angel Pons6fd9adb2020-09-15 12:34:36 +020052#define MCHBAR8_AND_OR(x, and, or) (MCHBAR8(x) = (MCHBAR8(x) & (and)) | (or))
53#define MCHBAR16_AND_OR(x, and, or) (MCHBAR16(x) = (MCHBAR16(x) & (and)) | (or))
54#define MCHBAR32_AND_OR(x, and, or) (MCHBAR32(x) = (MCHBAR32(x) & (and)) | (or))
Damien Zammit43a1f782015-08-19 15:16:59 +100055
Arthur Heymans1994e4482017-11-04 07:52:23 +010056#define CHDECMISC 0x111
57#define STACKED_MEM (1 << 1)
58
59#define C0DRB0 0x200
60#define C0DRB1 0x202
61#define C0DRB2 0x204
62#define C0DRB3 0x206
63#define C0DRA01 0x208
64#define C0DRA23 0x20a
65#define C0CKECTRL 0x260
66
67#define C1DRB0 0x600
68#define C1DRB1 0x602
69#define C1DRB2 0x604
70#define C1DRB3 0x606
71#define C1DRA01 0x608
72#define C1DRA23 0x60a
73#define C1CKECTRL 0x660
74
Damien Zammit43a1f782015-08-19 15:16:59 +100075#define PMSTS_MCHBAR 0x0f14 /* Self refresh channel status */
Arthur Heymans97e13d82016-11-30 18:40:38 +010076#define PMSTS_WARM_RESET (1 << 8)
77#define PMSTS_BOTH_SELFREFRESH (3 << 0)
Damien Zammit43a1f782015-08-19 15:16:59 +100078
79#define CLKCFG_MCHBAR 0x0c00
80#define CLKCFG_FSBCLK_SHIFT 0
81#define CLKCFG_FSBCLK_MASK (7 << CLKCFG_FSBCLK_SHIFT)
82#define CLKCFG_MEMCLK_SHIFT 4
83#define CLKCFG_MEMCLK_MASK (7 << CLKCFG_MEMCLK_SHIFT)
84#define CLKCFG_UPDATE (1 << 12)
85
Arthur Heymans5b30b822016-12-01 18:41:50 +010086#define SSKPD_MCHBAR 0x0c20 /* 64 bit */
Damien Zammit43a1f782015-08-19 15:16:59 +100087
88/*
89 * DMIBAR
90 */
91
Angel Pons6fd9adb2020-09-15 12:34:36 +020092#define DMIBAR8(x) (*((volatile u8 *)(DEFAULT_DMIBAR + (x))))
Arthur Heymans70a1dda2017-03-09 01:58:24 +010093#define DMIBAR16(x) (*((volatile u16 *)(DEFAULT_DMIBAR + (x))))
94#define DMIBAR32(x) (*((volatile u32 *)(DEFAULT_DMIBAR + (x))))
Damien Zammit43a1f782015-08-19 15:16:59 +100095
Angel Ponsa5314b62020-09-15 13:08:26 +020096#define DMIVCECH 0x000 /* 32bit */
97#define DMIPVCCAP1 0x004 /* 32bit */
98
99#define DMIVC0RCAP 0x010 /* 32bit */
100#define DMIVC0RCTL 0x014 /* 32bit */
101#define DMIVC0RSTS 0x01a /* 16bit */
102#define VC0NP (1 << 1)
103
104#define DMIVC1RCAP 0x01c /* 32bit */
105#define DMIVC1RCTL 0x020 /* 32bit */
106#define DMIVC1RSTS 0x026 /* 16bit */
107#define VC1NP (1 << 1)
108
109#define DMIVCPRCAP 0x028 /* 32bit */
110#define DMIVCPRCTL 0x02c /* 32bit */
111#define DMIVCPRSTS 0x032 /* 16bit */
112#define VCPNP (1 << 1)
113
114#define DMIVCMRCAP 0x034 /* 32bit */
115#define DMIVCMRCTL 0x038 /* 32bit */
116#define DMIVCMRSTS 0x03e /* 16bit */
117#define VCMNP (1 << 1)
118
119#define DMIESD 0x044 /* 32bit */
120
121#define DMILE1D 0x050 /* 32bit */
122#define DMILE1A 0x058 /* 64bit */
123#define DMILE2D 0x060 /* 32bit */
124#define DMILE2A 0x068 /* 64bit */
125
126#define DMILCAP 0x084 /* 32bit */
127#define DMILCTL 0x088 /* 16bit */
128#define DMILSTS 0x08a /* 16bit */
129
130#define DMIUESTS 0x1c4 /* 32bit */
131#define DMICESTS 0x1d0 /* 32bit */
Damien Zammit43a1f782015-08-19 15:16:59 +1000132
133/*
134 * EPBAR
135 */
136
Angel Pons6fd9adb2020-09-15 12:34:36 +0200137#define EPBAR8(x) (*((volatile u8 *)(DEFAULT_EPBAR + (x))))
Arthur Heymans70a1dda2017-03-09 01:58:24 +0100138#define EPBAR16(x) (*((volatile u16 *)(DEFAULT_EPBAR + (x))))
139#define EPBAR32(x) (*((volatile u32 *)(DEFAULT_EPBAR + (x))))
Damien Zammit43a1f782015-08-19 15:16:59 +1000140
Angel Ponsa5314b62020-09-15 13:08:26 +0200141#define EPPVCCAP1 0x004 /* 32bit */
142#define EPPVCCTL 0x00c /* 32bit */
143
144#define EPVC0RCAP 0x010 /* 32bit */
145#define EPVC0RCTL 0x014 /* 32bit */
146#define EPVC0RSTS 0x01a /* 16bit */
147
148#define EPVC1RCAP 0x01c /* 32bit */
149#define EPVC1RCTL 0x020 /* 32bit */
150#define EPVC1RSTS 0x026 /* 16bit */
151
152#define EPVC1MTS 0x028 /* 32bit */
153#define EPVC1ITC 0x02c /* 32bit */
154
155#define EPESD 0x044 /* 32bit */
156
157#define EPLE1D 0x050 /* 32bit */
158#define EPLE1A 0x058 /* 64bit */
159#define EPLE2D 0x060 /* 32bit */
160#define EPLE2A 0x068 /* 64bit */
161
162#define EP_PORTARB(x) (0x100 + 4 * (x)) /* 256bit */
163
164
Damien Zammit43a1f782015-08-19 15:16:59 +1000165
Angel Pons6fd9adb2020-09-15 12:34:36 +0200166#define NOP_CMD 0x2
167#define PRECHARGE_CMD 0x4
168#define MRS_CMD 0x6
169#define EMRS_CMD 0x8
170#define EMRS1_CMD (EMRS_CMD | 0x10)
171#define EMRS2_CMD (EMRS_CMD | 0x20)
172#define EMRS3_CMD (EMRS_CMD | 0x30)
173#define ZQCAL_CMD 0xa
174#define CBR_CMD 0xc
175#define NORMALOP_CMD 0xe
Damien Zammit43a1f782015-08-19 15:16:59 +1000176
Angel Pons6fd9adb2020-09-15 12:34:36 +0200177#define TOTAL_CHANNELS 2
178#define TOTAL_DIMMS 4
179#define TOTAL_BYTELANES 8
180#define DIMMS_PER_CHANNEL (TOTAL_DIMMS / TOTAL_CHANNELS)
181#define RAW_CARD_UNPOPULATED 0xff
182#define RAW_CARD_POPULATED 0
Damien Zammit43a1f782015-08-19 15:16:59 +1000183
Damien Zammit68e1dcf2016-06-03 15:39:30 +1000184#define DIMM_IS_POPULATED(dimms, idx) (dimms[idx].card_type != RAW_CARD_UNPOPULATED)
185#define IF_DIMM_POPULATED(dimms, idx) if (dimms[idx].card_type != RAW_CARD_UNPOPULATED)
Damien Zammit43a1f782015-08-19 15:16:59 +1000186#define ONLY_DIMMA_IS_POPULATED(dimms, ch) ( \
187 (DIMM_IS_POPULATED(dimms, (ch == 0) ? 0 : 2) && \
188 !DIMM_IS_POPULATED(dimms, (ch == 0) ? 1 : 3)))
189#define ONLY_DIMMB_IS_POPULATED(dimms, ch) ( \
190 (DIMM_IS_POPULATED(dimms, (ch == 0) ? 1 : 3) && \
191 !DIMM_IS_POPULATED(dimms, (ch == 0) ? 0 : 2)))
192#define BOTH_DIMMS_ARE_POPULATED(dimms, ch) ( \
193 (DIMM_IS_POPULATED(dimms, (ch == 0) ? 0 : 2) && \
194 (DIMM_IS_POPULATED(dimms, (ch == 0) ? 1 : 3))))
195#define FOR_EACH_DIMM(idx) \
196 for (idx = 0; idx < TOTAL_DIMMS; ++idx)
197#define FOR_EACH_POPULATED_DIMM(dimms, idx) \
198 FOR_EACH_DIMM(idx) IF_DIMM_POPULATED(dimms, idx)
Nico Huber696abfc2016-11-23 23:56:53 +0100199#define FOR_EACH_DIMM_IN_CHANNEL(ch, idx) \
Nico Huber3c209062016-11-26 02:03:25 +0100200 for (idx = (ch) << 1; idx < ((ch) << 1) + DIMMS_PER_CHANNEL; ++idx)
Nico Huber696abfc2016-11-23 23:56:53 +0100201#define FOR_EACH_POPULATED_DIMM_IN_CHANNEL(dimms, ch, idx) \
202 FOR_EACH_DIMM_IN_CHANNEL(ch, idx) IF_DIMM_POPULATED(dimms, idx)
Arthur Heymans70a1dda2017-03-09 01:58:24 +0100203#define CHANNEL_IS_POPULATED(dimms, idx) \
204 ((dimms[idx<<1].card_type != RAW_CARD_UNPOPULATED) \
205 || (dimms[(idx<<1) + 1].card_type != RAW_CARD_UNPOPULATED))
206#define CHANNEL_IS_CARDF(dimms, idx) \
207 ((dimms[idx<<1].card_type == 0xf) \
208 || (dimms[(idx<<1) + 1].card_type == 0xf))
209#define IF_CHANNEL_POPULATED(dimms, idx) \
210 if ((dimms[idx<<1].card_type != RAW_CARD_UNPOPULATED) \
211 || (dimms[(idx<<1) + 1].card_type != RAW_CARD_UNPOPULATED))
Damien Zammit43a1f782015-08-19 15:16:59 +1000212#define FOR_EACH_CHANNEL(idx) \
213 for (idx = 0; idx < TOTAL_CHANNELS; ++idx)
214#define FOR_EACH_POPULATED_CHANNEL(dimms, idx) \
215 FOR_EACH_CHANNEL(idx) IF_CHANNEL_POPULATED(dimms, idx)
216
217#define RANKS_PER_CHANNEL 4
218#define RANK_IS_POPULATED(dimms, ch, r) \
Damien Zammit68e1dcf2016-06-03 15:39:30 +1000219 (((dimms[ch<<1].card_type != RAW_CARD_UNPOPULATED) && ((r) < dimms[ch<<1].ranks)) || \
220 ((dimms[(ch<<1) + 1].card_type != RAW_CARD_UNPOPULATED) && ((r) >= 2) && ((r) < (dimms[(ch<<1) + 1].ranks + 2))))
Damien Zammit43a1f782015-08-19 15:16:59 +1000221#define IF_RANK_POPULATED(dimms, ch, r) \
Arthur Heymans70a1dda2017-03-09 01:58:24 +0100222 if (((dimms[ch<<1].card_type != RAW_CARD_UNPOPULATED) \
223 && ((r) < dimms[ch<<1].ranks)) \
224 || ((dimms[(ch<<1) + 1].card_type != RAW_CARD_UNPOPULATED) \
225 && ((r) >= 2) && ((r) < (dimms[(ch<<1) + 1].ranks + 2))))
Damien Zammit43a1f782015-08-19 15:16:59 +1000226#define FOR_EACH_RANK_IN_CHANNEL(r) \
227 for (r = 0; r < RANKS_PER_CHANNEL; ++r)
228#define FOR_EACH_POPULATED_RANK_IN_CHANNEL(dimms, ch, r) \
229 FOR_EACH_RANK_IN_CHANNEL(r) IF_RANK_POPULATED(dimms, ch, r)
230#define FOR_EACH_RANK(ch, r) \
231 FOR_EACH_CHANNEL(ch) FOR_EACH_RANK_IN_CHANNEL(r)
232#define FOR_EACH_POPULATED_RANK(dimms, ch, r) \
233 FOR_EACH_RANK(ch, r) IF_RANK_POPULATED(dimms, ch, r)
Arthur Heymans276049f2017-11-05 05:56:34 +0100234#define FOR_EACH_BYTELANE(l) \
235 for (l = 0; l < TOTAL_BYTELANES; l++)
236#define FOR_EACH_POPULATED_CHANNEL_AND_BYTELANE(dimms, ch, l) \
237 FOR_EACH_POPULATED_CHANNEL (dimms, ch) FOR_EACH_BYTELANE(l)
Damien Zammit43a1f782015-08-19 15:16:59 +1000238
239#define DDR3_MAX_CAS 18
240
241enum fsb_clock {
Angel Pons6fd9adb2020-09-15 12:34:36 +0200242 FSB_CLOCK_800MHz = 0,
243 FSB_CLOCK_1066MHz = 1,
244 FSB_CLOCK_1333MHz = 2,
Damien Zammit43a1f782015-08-19 15:16:59 +1000245};
246
247enum mem_clock {
248 MEM_CLOCK_400MHz = 0,
249 MEM_CLOCK_533MHz = 1,
250 MEM_CLOCK_667MHz = 2,
251 MEM_CLOCK_800MHz = 3,
Angel Pons6fd9adb2020-09-15 12:34:36 +0200252 MEM_CLOCK_1066MHz = 4,
253 MEM_CLOCK_1333MHz = 5,
Damien Zammit43a1f782015-08-19 15:16:59 +1000254};
255
256enum ddr {
257 DDR2 = 2,
258 DDR3 = 3,
259};
260
261enum ddrxspd {
262 DDR2SPD = 0x8,
263 DDR3SPD = 0xb,
264};
265
266enum chip_width { /* as in DDR3 spd */
267 CHIP_WIDTH_x4 = 0,
268 CHIP_WIDTH_x8 = 1,
269 CHIP_WIDTH_x16 = 2,
270 CHIP_WIDTH_x32 = 3,
271};
272
273enum chip_cap { /* as in DDR3 spd */
274 CHIP_CAP_256M = 0,
275 CHIP_CAP_512M = 1,
276 CHIP_CAP_1G = 2,
277 CHIP_CAP_2G = 3,
278 CHIP_CAP_4G = 4,
279 CHIP_CAP_8G = 5,
280 CHIP_CAP_16G = 6,
281};
282
Arthur Heymans27f0ca12017-05-09 18:38:14 +0200283struct dll_setting {
284 u8 tap;
285 u8 pi;
286 u8 db_en;
287 u8 db_sel;
288 u8 clk_delay;
289 u8 coarse;
290};
291
Arthur Heymans0bf87de2017-11-04 06:15:05 +0100292struct rt_dqs_setting {
293 u8 tap;
294 u8 pi;
295};
296
Arthur Heymans3cf94032017-04-05 16:17:26 +0200297enum n_banks {
298 N_BANKS_4 = 0,
299 N_BANKS_8 = 1,
300};
301
Damien Zammit43a1f782015-08-19 15:16:59 +1000302struct timings {
303 unsigned int CAS;
Angel Pons6fd9adb2020-09-15 12:34:36 +0200304 unsigned int tclk;
Damien Zammit43a1f782015-08-19 15:16:59 +1000305 enum fsb_clock fsb_clk;
306 enum mem_clock mem_clk;
307 unsigned int tRAS;
308 unsigned int tRP;
309 unsigned int tRCD;
310 unsigned int tWR;
311 unsigned int tRFC;
312 unsigned int tWTR;
313 unsigned int tRRD;
314 unsigned int tRTP;
315};
316
317struct dimminfo {
Angel Pons6fd9adb2020-09-15 12:34:36 +0200318 unsigned int card_type; /* 0xff: unpopulated, 0xa - 0xf: raw card type A - F */
Damien Zammit43a1f782015-08-19 15:16:59 +1000319 enum chip_width width;
Damien Zammit43a1f782015-08-19 15:16:59 +1000320 unsigned int page_size; /* of whole DIMM in Bytes (4096 or 8192) */
Arthur Heymans3cf94032017-04-05 16:17:26 +0200321 enum n_banks n_banks;
Damien Zammit43a1f782015-08-19 15:16:59 +1000322 unsigned int ranks;
323 unsigned int rows;
324 unsigned int cols;
Angel Pons6fd9adb2020-09-15 12:34:36 +0200325 u16 spd_crc;
Arthur Heymansf1287262017-12-25 18:30:01 +0100326 u8 mirrored;
Arthur Heymansadc571a2017-09-25 09:40:54 +0200327};
328
329struct rcven_timings {
330 u8 min_common_coarse;
Arthur Heymans276049f2017-11-05 05:56:34 +0100331 u8 coarse_offset[TOTAL_BYTELANES];
332 u8 medium[TOTAL_BYTELANES];
333 u8 tap[TOTAL_BYTELANES];
334 u8 pi[TOTAL_BYTELANES];
Damien Zammit43a1f782015-08-19 15:16:59 +1000335};
336
337/* The setup is up to two DIMMs per channel */
338struct sysinfo {
Damien Zammit43a1f782015-08-19 15:16:59 +1000339 int boot_path;
Damien Zammit43a1f782015-08-19 15:16:59 +1000340 enum fsb_clock max_fsb;
Damien Zammit43a1f782015-08-19 15:16:59 +1000341
342 int dimm_config[2];
Damien Zammit43a1f782015-08-19 15:16:59 +1000343 int spd_type;
344 int channel_capacity[2];
345 struct timings selected_timings;
346 struct dimminfo dimms[4];
347 u8 spd_map[4];
Arthur Heymansadc571a2017-09-25 09:40:54 +0200348 struct rcven_timings rcven_t[TOTAL_CHANNELS];
Arthur Heymans0bf87de2017-11-04 06:15:05 +0100349 /*
350 * The rt_dqs delay register for rank 0 seems to be used
351 * for all other ranks on the channel, so only save that
352 */
Arthur Heymans276049f2017-11-05 05:56:34 +0100353 struct rt_dqs_setting rt_dqs[TOTAL_CHANNELS][TOTAL_BYTELANES];
354 struct dll_setting dqs_settings[TOTAL_CHANNELS][TOTAL_BYTELANES];
355 struct dll_setting dq_settings[TOTAL_CHANNELS][TOTAL_BYTELANES];
Arthur Heymans7a3a3192017-05-15 10:26:29 +0200356 u8 nmode;
Arthur Heymans0602ce62018-05-26 14:44:42 +0200357 u8 stacked_mode;
Damien Zammit43a1f782015-08-19 15:16:59 +1000358};
Arthur Heymans97e13d82016-11-30 18:40:38 +0100359#define BOOT_PATH_NORMAL 0
360#define BOOT_PATH_WARM_RESET 1
361#define BOOT_PATH_RESUME 2
Damien Zammit43a1f782015-08-19 15:16:59 +1000362
363enum ddr2_signals {
Elyes HAOUAS6e8b3c12016-09-02 19:22:00 +0200364 CLKSET0 = 0,
365 CTRL0,
366 CLKSET1,
367 CMD,
368 CTRL1,
369 CTRL2,
370 CTRL3,
Damien Zammit43a1f782015-08-19 15:16:59 +1000371};
372
373void x4x_early_init(void);
Arthur Heymansef7e98a2016-12-30 21:07:18 +0100374void x4x_late_init(int s3resume);
Arthur Heymansbf53acc2019-11-11 21:14:39 +0100375void mb_get_spd_map(u8 spd_map[4]);
376void mb_pre_raminit_setup(int s3_resume);
Damien Zammit43a1f782015-08-19 15:16:59 +1000377u32 decode_igd_memory_size(u32 gms);
378u32 decode_igd_gtt_size(u32 gsm);
Arthur Heymans4c65bfc2018-04-10 13:34:24 +0200379u32 decode_tseg_size(const u32 esmramc);
Angel Ponsecec9472020-08-03 15:44:27 +0200380int decode_pcie_bar(u32 *const base, u32 *const len);
Damien Zammit43a1f782015-08-19 15:16:59 +1000381void sdram_initialize(int boot_path, const u8 *spd_map);
Arthur Heymansa2cc2312017-05-15 10:13:36 +0200382void do_raminit(struct sysinfo *, int fast_boot);
Arthur Heymansadc571a2017-09-25 09:40:54 +0200383void rcven(struct sysinfo *s);
Elyes HAOUASe951e8e2019-06-15 11:03:00 +0200384u32 fsb_to_mhz(u32 speed);
385u32 ddr_to_mhz(u32 speed);
Arthur Heymans1994e4482017-11-04 07:52:23 +0100386u32 test_address(int channel, int rank);
Arthur Heymans95c48cb2017-11-04 08:07:06 +0100387void dqsset(u8 ch, u8 lane, const struct dll_setting *setting);
388void dqset(u8 ch, u8 lane, const struct dll_setting *setting);
Angel Pons6fd9adb2020-09-15 12:34:36 +0200389void rt_set_dqs(u8 channel, u8 lane, u8 rank, struct rt_dqs_setting *dqs_setting);
Arthur Heymans95c48cb2017-11-04 08:07:06 +0100390int do_write_training(struct sysinfo *s);
391int do_read_training(struct sysinfo *s);
Arthur Heymansb5170c32017-12-25 20:13:28 +0100392void search_write_leveling(struct sysinfo *s);
393void send_jedec_cmd(const struct sysinfo *s, u8 r, u8 ch, u8 cmd, u32 val);
Damien Zammit43a1f782015-08-19 15:16:59 +1000394
Arthur Heymans0bf87de2017-11-04 06:15:05 +0100395extern const struct dll_setting default_ddr2_667_ctrl[7];
396extern const struct dll_setting default_ddr2_800_ctrl[7];
397extern const struct dll_setting default_ddr3_800_ctrl[2][7];
398extern const struct dll_setting default_ddr3_1067_ctrl[2][7];
399extern const struct dll_setting default_ddr3_1333_ctrl[2][7];
Arthur Heymans276049f2017-11-05 05:56:34 +0100400extern const struct dll_setting default_ddr2_667_dqs[TOTAL_BYTELANES];
401extern const struct dll_setting default_ddr2_800_dqs[TOTAL_BYTELANES];
402extern const struct dll_setting default_ddr3_800_dqs[2][TOTAL_BYTELANES];
403extern const struct dll_setting default_ddr3_1067_dqs[2][TOTAL_BYTELANES];
404extern const struct dll_setting default_ddr3_1333_dqs[2][TOTAL_BYTELANES];
405extern const struct dll_setting default_ddr2_667_dq[TOTAL_BYTELANES];
406extern const struct dll_setting default_ddr2_800_dq[TOTAL_BYTELANES];
407extern const struct dll_setting default_ddr3_800_dq[2][TOTAL_BYTELANES];
408extern const struct dll_setting default_ddr3_1067_dq[2][TOTAL_BYTELANES];
409extern const struct dll_setting default_ddr3_1333_dq[2][TOTAL_BYTELANES];
Arthur Heymansf1287262017-12-25 18:30:01 +0100410extern const u8 ddr3_emrs1_rtt_nom_config[16][4];
Arthur Heymans0d284952017-05-25 19:55:52 +0200411extern const u8 post_jedec_tab[3][4][2];
Arthur Heymans3fa103a2017-05-25 19:54:49 +0200412extern const u32 ddr3_c2_tab[2][3][6][2];
413extern const u8 ddr3_c2_x264[3][6];
414extern const u16 ddr3_c2_x23c[3][6];
Arthur Heymans0bf87de2017-11-04 06:15:05 +0100415
Kyösti Mälkkid7205be2019-09-27 07:24:17 +0300416#include <device/device.h>
Damien Zammit43a1f782015-08-19 15:16:59 +1000417struct acpi_rsdp;
Furquan Shaikh0f007d82020-04-24 06:41:18 -0700418unsigned long northbridge_write_acpi_tables(const struct device *device,
Elyes HAOUASfea02e12018-02-08 14:59:03 +0100419 unsigned long start, struct acpi_rsdp *rsdp);
Kyösti Mälkkid7205be2019-09-27 07:24:17 +0300420
Damien Zammit43a1f782015-08-19 15:16:59 +1000421#endif /* __NORTHBRIDGE_INTEL_X4X_H__ */