Chameleon

Chameleon Svn Source Tree

Root/branches/Bungo/i386/libsaio/dram_controllers.c

1/*
2 * dram controller access and scan from the pci host controller
3 * Integrated and adapted for chameleon 2.0 RC5 by Rekursor from bs0d work
4 * original source comes from:
5 *
6 * memtest86
7 *
8 * Released under version 2 of the Gnu Public License.
9 * By Chris Brady, cbrady@sgi.com
10 * ----------------------------------------------------
11 * MemTest86+ V4.00 Specific code (GPL V2.0)
12 * By Samuel DEMEULEMEESTER, sdemeule@memtest.org
13 * http://www.canardpc.com - http://www.memtest.org
14 */
15
16#include "libsaio.h"
17#include "bootstruct.h"
18#include "pci.h"
19#include "platform.h"
20#include "dram_controllers.h"
21
22#ifndef DEBUG_DRAM
23#define DEBUG_DRAM 0
24#endif
25
26#if DEBUG_DRAM
27#define DBG(x...) printf(x)
28#else
29#define DBG(x...)
30#endif
31
32/*
33 * Initialise memory controller functions
34 */
35
36// Setup P35 Memory Controller
37static void setup_p35(pci_dt_t *dram_dev)
38{
39uint32_t dev0;
40
41// Activate MMR I/O
42dev0 = pci_config_read32(dram_dev->dev.addr, 0x48);
43if (!(dev0 & 0x1))
44{
45pci_config_write8(dram_dev->dev.addr, 0x48, (dev0 | 1));
46}
47}
48
49int nhm_bus = 0x3F;
50
51// Setup Nehalem Integrated Memory Controller
52static void setup_nhm(pci_dt_t *dram_dev)
53{
54static long possible_nhm_bus[] = {0xFF, 0x7F, 0x3F};
55unsigned long did, vid;
56int i;
57
58// Nehalem supports Scrubbing
59// First, locate the PCI bus where the MCH is located
60for(i = 0; i < (sizeof(possible_nhm_bus)/sizeof(possible_nhm_bus[0])); i++)
61{
62vid = pci_config_read16(PCIADDR(possible_nhm_bus[i], 3, 4), PCI_VENDOR_ID);
63did = pci_config_read16(PCIADDR(possible_nhm_bus[i], 3, 4), PCI_DEVICE_ID);
64vid &= 0xFFFF;
65did &= 0xFF00;
66
67if(vid == 0x8086 && did >= 0x2C00)
68{
69nhm_bus = possible_nhm_bus[i];
70}
71}
72}
73
74/*
75 * Retrieve memory controller fsb functions
76 */
77
78
79// Get i965 Memory Speed
80static void get_fsb_i965(pci_dt_t *dram_dev)
81{
82uint32_t dev0, mch_ratio, mch_cfg, mch_fsb;
83
84long *ptr;
85
86// Find Ratio
87dev0 = pci_config_read32(dram_dev->dev.addr, 0x48);
88dev0 &= 0xFFFFC000;
89ptr = (long*)(dev0 + 0xC00);
90mch_cfg = *ptr & 0xFFFF;
91
92mch_ratio = 100000;
93
94switch (mch_cfg & 7)
95{
96case 0: mch_fsb = 1066; break;
97case 1: mch_fsb = 533; break;
98default:
99case 2: mch_fsb = 800; break;
100case 3: mch_fsb = 667; break;
101case 4: mch_fsb = 1333; break;
102case 6: mch_fsb = 1600; break;
103}
104
105DBG("mch_fsb %d\n", mch_fsb);
106
107switch (mch_fsb)
108{
109case 533:
110switch ((mch_cfg >> 4) & 7)
111{
112case 1:mch_ratio = 200000; break;
113case 2:mch_ratio = 250000; break;
114case 3:mch_ratio = 300000; break;
115}
116break;
117
118default:
119case 800:
120switch ((mch_cfg >> 4) & 7)
121{
122case 0:mch_ratio = 100000; break;
123case 1:mch_ratio = 125000; break;
124case 2:mch_ratio = 166667; break; // 1.666666667
125case 3:mch_ratio = 200000; break;
126case 4:mch_ratio = 266667; break; // 2.666666667
127case 5:mch_ratio = 333333; break; // 3.333333333
128}
129break;
130
131case 1066:
132switch ((mch_cfg >> 4) & 7)
133{
134case 1:mch_ratio = 100000; break;
135case 2:mch_ratio = 125000; break;
136case 3:mch_ratio = 150000; break;
137case 4:mch_ratio = 200000; break;
138case 5:mch_ratio = 250000; break;
139}
140break;
141
142case 1333:
143switch ((mch_cfg >> 4) & 7)
144{
145case 2:mch_ratio = 100000; break;
146case 3:mch_ratio = 120000; break;
147case 4:mch_ratio = 160000; break;
148case 5:mch_ratio = 200000; break;
149}
150break;
151
152case 1600:
153switch ((mch_cfg >> 4) & 7)
154{
155case 3:mch_ratio = 100000; break;
156case 4:mch_ratio = 133333; break; // 1.333333333
157case 5:mch_ratio = 150000; break;
158case 6:mch_ratio = 200000; break;
159}
160break;
161}
162
163DBG("mch_ratio %d\n", mch_ratio);
164
165// Compute RAM Frequency
166Platform.RAM.Frequency = (Platform.CPU.FSBFrequency * mch_ratio) / 100000;
167
168DBG("ram_fsb %d\n", Platform.RAM.Frequency);
169
170}
171
172// Get i965m Memory Speed
173static void get_fsb_im965(pci_dt_t *dram_dev)
174{
175uint32_t dev0, mch_ratio, mch_cfg, mch_fsb;
176
177long *ptr;
178
179// Find Ratio
180dev0 = pci_config_read32(dram_dev->dev.addr, 0x48);
181dev0 &= 0xFFFFC000;
182ptr = (long*)(dev0 + 0xC00);
183mch_cfg = *ptr & 0xFFFF;
184
185mch_ratio = 100000;
186
187switch (mch_cfg & 7)
188{
189case 1: mch_fsb = 533; break;
190default:
191case 2:mch_fsb = 800; break;
192case 3:mch_fsb = 667; break;
193case 6:mch_fsb = 1066; break;
194}
195
196switch (mch_fsb)
197{
198case 533:
199switch ((mch_cfg >> 4) & 7)
200{
201case 1:mch_ratio = 125000; break;
202case 2:mch_ratio = 150000; break;
203case 3:mch_ratio = 200000; break;
204}
205break;
206
207case 667:
208switch ((mch_cfg >> 4)& 7)
209{
210case 1:mch_ratio = 100000; break;
211case 2:mch_ratio = 120000; break;
212case 3:mch_ratio = 160000; break;
213case 4:mch_ratio = 200000; break;
214case 5:mch_ratio = 240000; break;
215}
216break;
217
218default:
219case 800:
220switch ((mch_cfg >> 4) & 7)
221{
222case 1:mch_ratio = 83333; break; // 0.833333333
223case 2:mch_ratio = 100000; break;
224case 3:mch_ratio = 133333; break; // 1.333333333
225case 4:mch_ratio = 166667; break; // 1.666666667
226case 5:mch_ratio = 200000; break;
227}
228break;
229case 1066:
230switch ((mch_cfg >> 4)&7)
231{
232case 5:mch_ratio = 150000; break;
233case 6:mch_ratio = 200000; break;
234}
235
236}
237
238// Compute RAM Frequency
239Platform.RAM.Frequency = (Platform.CPU.FSBFrequency * mch_ratio) / 100000;
240}
241
242
243// Get iCore7 Memory Speed
244static void get_fsb_nhm(pci_dt_t *dram_dev)
245{
246uint32_t mch_ratio, mc_dimm_clk_ratio;
247
248// Get the clock ratio
249mc_dimm_clk_ratio = pci_config_read16(PCIADDR(nhm_bus, 3, 4), 0x54 );
250mch_ratio = (mc_dimm_clk_ratio & 0x1F);
251
252// Compute RAM Frequency
253Platform.RAM.Frequency = Platform.CPU.FSBFrequency * mch_ratio / 2;
254}
255/*
256// Get iCore 32nn Memory Speed
257static void get_fsb_nhm32(pci_dt_t *dram_dev)
258{
259uint32_t mch_ratio, mc_dimm_clk_ratio;
260
261// Get the clock ratio
262mc_dimm_clk_ratio = pci_config_read16(PCIADDR(nhm_bus, 3, 4), 0x54 );
263mch_ratio = (mc_dimm_clk_ratio & 0x1F);
264
265// Compute RAM Frequency
266Platform.RAM.Frequency = Platform.CPU.FSBFrequency * mch_ratio / 2;
267}*/
268
269/*
270 * Retrieve memory controller info functions
271 */
272
273// Get i965 Memory Timings
274static void get_timings_i965(pci_dt_t *dram_dev)
275{
276// Thanks for CDH optis
277uint32_t dev0, c0ckectrl, c1ckectrl, offset;
278uint32_t ODT_Control_Register, Precharge_Register, ACT_Register, Read_Register, Misc_Register;
279
280long *ptr;
281
282// Read MMR Base Address
283dev0 = pci_config_read32(dram_dev->dev.addr, 0x48);
284dev0 &= 0xFFFFC000;
285
286ptr = (long*)(dev0 + 0x260);
287c0ckectrl = *ptr & 0xFFFFFFFF;
288
289ptr = (long*)(dev0 + 0x660);
290c1ckectrl = *ptr & 0xFFFFFFFF;
291
292// If DIMM 0 not populated, check DIMM 1
293((c0ckectrl) >> 20 & 0xF) ? (offset = 0) : (offset = 0x400);
294
295ptr = (long*)(dev0 + offset + 0x29C);
296ODT_Control_Register = *ptr & 0xFFFFFFFF;
297
298ptr = (long*)(dev0 + offset + 0x250);
299Precharge_Register = *ptr & 0xFFFFFFFF;
300
301ptr = (long*)(dev0 + offset + 0x252);
302ACT_Register = *ptr & 0xFFFFFFFF;
303
304ptr = (long*)(dev0 + offset + 0x258);
305Read_Register = *ptr & 0xFFFFFFFF;
306
307ptr = (long*)(dev0 + offset + 0x244);
308Misc_Register = *ptr & 0xFFFFFFFF;
309
310// 965 Series only support DDR2
311Platform.RAM.Type = SMB_MEM_TYPE_DDR2;
312
313// CAS Latency (tCAS)
314Platform.RAM.CAS = ((ODT_Control_Register >> 17) & 7) + 3;
315
316// RAS-To-CAS (tRCD)
317Platform.RAM.TRC = (Read_Register >> 16) & 0xF;
318
319// RAS Precharge (tRP)
320Platform.RAM.TRP = (ACT_Register >> 13) & 0xF;
321
322// RAS Active to precharge (tRAS)
323Platform.RAM.RAS = (Precharge_Register >> 11) & 0x1F;
324
325if ((c0ckectrl >> 20 & 0xF) && (c1ckectrl >> 20 & 0xF)) {
326Platform.RAM.Channels = SMB_MEM_CHANNEL_DUAL;
327} else {
328Platform.RAM.Channels = SMB_MEM_CHANNEL_SINGLE;
329}
330}
331
332// Get im965 Memory Timings
333static void get_timings_im965(pci_dt_t *dram_dev)
334{
335// Thanks for CDH optis
336uint32_t dev0, c0ckectrl, c1ckectrl, offset, ODT_Control_Register, Precharge_Register;
337long *ptr;
338
339// Read MMR Base Address
340dev0 = pci_config_read32(dram_dev->dev.addr, 0x48);
341dev0 &= 0xFFFFC000;
342
343ptr = (long*)(dev0 + 0x1200);
344c0ckectrl = *ptr & 0xFFFFFFFF;
345
346ptr = (long*)(dev0 + 0x1300);
347c1ckectrl = *ptr & 0xFFFFFFFF;
348
349// If DIMM 0 not populated, check DIMM 1
350((c0ckectrl) >> 20 & 0xF) ? (offset = 0) : (offset = 0x100);
351
352ptr = (long*)(dev0 + offset + 0x121C);
353ODT_Control_Register = *ptr & 0xFFFFFFFF;
354
355ptr = (long*)(dev0 + offset + 0x1214);
356Precharge_Register = *ptr & 0xFFFFFFFF;
357
358// Series only support DDR2
359Platform.RAM.Type = SMB_MEM_TYPE_DDR2;
360
361// CAS Latency (tCAS)
362Platform.RAM.CAS = ((ODT_Control_Register >> 23) & 7) + 3;
363
364// RAS-To-CAS (tRCD)
365Platform.RAM.TRC = ((Precharge_Register >> 5) & 7) + 2;
366
367// RAS Precharge (tRP)
368Platform.RAM.TRP= (Precharge_Register & 7) + 2;
369
370// RAS Active to precharge (tRAS)
371Platform.RAM.RAS = (Precharge_Register >> 21) & 0x1F;
372
373if ((c0ckectrl >> 20 & 0xF) && (c1ckectrl >> 20 & 0xF)) {
374Platform.RAM.Channels = SMB_MEM_CHANNEL_DUAL;
375} else {
376Platform.RAM.Channels = SMB_MEM_CHANNEL_SINGLE;
377}
378}
379
380// Get P35 Memory Timings
381static void get_timings_p35(pci_dt_t *dram_dev)
382{
383// Thanks for CDH optis
384unsigned long dev0, Memory_Check, c0ckectrl, c1ckectrl, offset;
385unsigned long ODT_Control_Register, Precharge_Register, ACT_Register, Read_Register, Misc_Register;
386long *ptr;
387
388//Device_ID = pci_config_read16(dram_dev->dev.addr, 0x02);
389//Device_ID &= 0xFFFF;
390
391// Now, read MMR Base Address
392dev0 = pci_config_read32(dram_dev->dev.addr, 0x48);
393dev0 &= 0xFFFFC000;
394
395ptr = (long*)(dev0 + 0x260);
396c0ckectrl = *ptr & 0xFFFFFFFF;
397
398ptr = (long*)(dev0 + 0x660);
399c1ckectrl = *ptr & 0xFFFFFFFF;
400
401// If DIMM 0 not populated, check DIMM 1
402((c0ckectrl) >> 20 & 0xF) ? (offset = 0) : (offset = 0x400);
403
404ptr = (long*)(dev0 + offset + 0x265);
405ODT_Control_Register = *ptr & 0xFFFFFFFF;
406
407ptr = (long*)(dev0 + offset + 0x25D);
408Precharge_Register = *ptr & 0xFFFFFFFF;
409
410ptr = (long*)(dev0 + offset + 0x252);
411ACT_Register = *ptr & 0xFFFFFFFF;
412
413ptr = (long*)(dev0 + offset + 0x258);
414Read_Register = *ptr & 0xFFFFFFFF;
415
416ptr = (long*)(dev0 + offset + 0x244);
417Misc_Register = *ptr & 0xFFFFFFFF;
418
419ptr = (long*)(dev0 + offset + 0x1E8);
420Memory_Check = *ptr & 0xFFFFFFFF;
421
422// On P45, check 1A8
423if(dram_dev->device_id > 0x2E00) {
424ptr = (long*)(dev0 + offset + 0x1A8);
425Memory_Check = *ptr & 0xFFFFFFFF;
426Memory_Check >>= 2;
427Memory_Check &= 1;
428Memory_Check = !Memory_Check;
429} else {
430ptr = (long*)(dev0 + offset + 0x1E8);
431Memory_Check = *ptr & 0xFFFFFFFF;
432}
433
434// Determine DDR-II or DDR-III
435if (Memory_Check & 1) {
436Platform.RAM.Type = SMB_MEM_TYPE_DDR2;
437} else {
438Platform.RAM.Type = SMB_MEM_TYPE_DDR3;
439}
440
441// CAS Latency (tCAS)
442if(dram_dev->device_id > 0x2E00) {
443Platform.RAM.CAS = ((ODT_Control_Register >> 8) & 0x3F) - 6;
444} else {
445Platform.RAM.CAS = ((ODT_Control_Register >> 8) & 0x3F) - 9;
446}
447
448// RAS-To-CAS (tRCD)
449Platform.RAM.TRC = (Read_Register >> 17) & 0xF;
450
451// RAS Precharge (tRP)
452Platform.RAM.TRP = (ACT_Register >> 13) & 0xF;
453
454// RAS Active to precharge (tRAS)
455Platform.RAM.RAS = Precharge_Register & 0x3F;
456
457// Channel configuration
458if (((c0ckectrl >> 20) & 0xF) && ((c1ckectrl >> 20) & 0xF)) {
459Platform.RAM.Channels = SMB_MEM_CHANNEL_DUAL;
460} else {
461Platform.RAM.Channels = SMB_MEM_CHANNEL_SINGLE;
462}
463}
464
465// Get Nehalem Memory Timings
466static void get_timings_nhm(pci_dt_t *dram_dev)
467{
468unsigned long mc_channel_bank_timing, mc_control, mc_channel_mrs_value;
469int fvc_bn = 4;
470
471// Find which channels are populated
472mc_control = pci_config_read16(PCIADDR(nhm_bus, 3, 0), 0x48);
473mc_control = (mc_control >> 8) & 0x7;
474
475// DDR-III
476Platform.RAM.Type = SMB_MEM_TYPE_DDR3;
477
478// Get the first valid channel
479if(mc_control & 1) {
480fvc_bn = 4;
481} else if(mc_control & 2) {
482fvc_bn = 5;
483} else if(mc_control & 7) {
484fvc_bn = 6;
485}
486
487// Now, detect timings
488mc_channel_bank_timing = pci_config_read32(PCIADDR(nhm_bus, fvc_bn, 0), 0x88);
489mc_channel_mrs_value = pci_config_read32(PCIADDR(nhm_bus, fvc_bn, 0), 0x70);
490
491// CAS Latency (tCAS)
492Platform.RAM.CAS = ((mc_channel_mrs_value >> 4) & 0xF ) + 4;
493
494// RAS-To-CAS (tRCD)
495Platform.RAM.TRC = (mc_channel_bank_timing >> 9) & 0xF;
496
497// RAS Active to precharge (tRAS)
498Platform.RAM.RAS = (mc_channel_bank_timing >> 4) & 0x1F;
499
500// RAS Precharge (tRP)
501Platform.RAM.TRP = mc_channel_bank_timing & 0xF;
502
503// Single , Dual or Triple Channels
504if (mc_control == 1 || mc_control == 2 || mc_control == 4 ) {
505Platform.RAM.Channels = SMB_MEM_CHANNEL_SINGLE;
506} else if (mc_control == 7) {
507Platform.RAM.Channels = SMB_MEM_CHANNEL_TRIPLE;
508} else {
509Platform.RAM.Channels = SMB_MEM_CHANNEL_DUAL;
510}
511}
512
513static struct mem_controller_t dram_controllers[] = {
514
515// Default unknown chipset
516{ 0, 0, "",NULL, NULL, NULL },
517
518// Intel
519//{ 0x8086, 0x0100, "2rd Gen Core processor",NULL, NULL, NULL },
520//{ 0x8086, 0x0104, "2rd Gen Core processor",NULL, NULL, NULL },
521//{ 0x8086, 0x010C, "Xeon E3-1200/2rd Gen Core processor",NULL, NULL, NULL },
522//{ 0x8086, 0x0150, "Xeon E3-1200 v2/3rd Gen Core processor",NULL, NULL, NULL },
523//{ 0x8086, 0x0154, "3rd Gen Core processor",NULL, NULL, NULL },
524//{ 0x8086, 0x0158, "Xeon E3-1200 v2/Ivy Bridge",NULL, NULL, NULL },
525//{ 0x8086, 0x015C, "Xeon E3-1200 v2/3rd Gen Core processor",NULL, NULL, NULL },
526
527//{ 0x8086, 0x0BF0, "Atom Processor D2xxx/N2xxx",NULL, NULL, NULL },
528//{ 0x8086, 0x0BF1, "Atom Processor D2xxx/N2xxx",NULL, NULL, NULL },
529//{ 0x8086, 0x0BF2, "Atom Processor D2xxx/N2xxx",NULL, NULL, NULL },
530//{ 0x8086, 0x0BF3, "Atom Processor D2xxx/N2xxx",NULL, NULL, NULL },
531//{ 0x8086, 0x0BF4, "Atom Processor D2xxx/N2xxx",NULL, NULL, NULL },
532//{ 0x8086, 0x0BF5, "Atom Processor D2xxx/N2xxx",NULL, NULL, NULL },
533//{ 0x8086, 0x0BF6, "Atom Processor D2xxx/N2xxx",NULL, NULL, NULL },
534//{ 0x8086, 0x0BF7, "Atom Processor D2xxx/N2xxx",NULL, NULL, NULL },
535
536//{ 0x8086, 0x0C00, "Haswell",NULL, NULL, NULL },
537//{ 0x8086, 0x0C04, "Haswell",NULL, NULL, NULL },
538//{ 0x8086, 0x0C08, "Haswell",NULL, NULL, NULL },
539
540{ 0x8086, 0x7190, "VMWare",NULL, NULL, NULL },
541
542{ 0x8086, 0x1A30, "82845 845 [Brookdale]",NULL, NULL, NULL },
543
544{ 0x8086, 0x2970, "82946GZ/PL/GL",setup_p35, get_fsb_i965,get_timings_i965},
545{ 0x8086, 0x2990, "82Q963/Q965",setup_p35, get_fsb_i965,get_timings_i965},
546{ 0x8086, 0x29A0, "P965/G965",setup_p35, get_fsb_i965,get_timings_i965},
547
548{ 0x8086, 0x2A00, "GM965/GL960",setup_p35, get_fsb_im965,get_timings_im965},
549{ 0x8086, 0x2A10, "GME965/GLE960",setup_p35, get_fsb_im965,get_timings_im965},
550{ 0x8086, 0x2A40, "PM/GM45/47",setup_p35, get_fsb_im965,get_timings_im965},
551
552{ 0x8086, 0x29B0, "82Q35 Express",setup_p35, get_fsb_i965,get_timings_p35},
553{ 0x8086, 0x29C0, "82G33/G31/P35/P31",setup_p35, get_fsb_i965,get_timings_p35},
554{ 0x8086, 0x29D0, "82Q33 Express",setup_p35, get_fsb_i965,get_timings_p35},
555{ 0x8086, 0x29E0, "82X38/X48 Express",setup_p35, get_fsb_i965,get_timings_p35},
556//{ 0x8086, 0x29F0, "3200/3210 Chipset",NULL, NULL, NULL },
557
558{ 0x8086, 0x2E00, "Eaglelake",setup_p35, get_fsb_i965,get_timings_p35},
559{ 0x8086, 0x2E10, "Q45/Q43",setup_p35, get_fsb_i965,get_timings_p35},
560{ 0x8086, 0x2E20, "P45/G45",setup_p35, get_fsb_i965,get_timings_p35},
561{ 0x8086, 0x2E30, "G41",setup_p35, get_fsb_i965,get_timings_p35},
562//{ 0x8086, 0x2E40, "4 Series Chipset",NULL, NULL, NULL },
563//{ 0x8086, 0x2E90, "4 Series Chipset",NULL, NULL, NULL },
564
565{ 0x8086, 0xD131, "NHM IMC",setup_nhm, get_fsb_nhm,get_timings_nhm},
566{ 0x8086, 0xD132, "NHM IMC",setup_nhm, get_fsb_nhm,get_timings_nhm},
567{ 0x8086, 0x3400, "5520/5500/X58",setup_nhm, get_fsb_nhm,get_timings_nhm},
568{ 0x8086, 0x3401, "5520/5500/X58",setup_nhm, get_fsb_nhm,get_timings_nhm},
569{ 0x8086, 0x3402, "5520/5500/X58",setup_nhm, get_fsb_nhm,get_timings_nhm},
570{ 0x8086, 0x3403, "5500",setup_nhm, get_fsb_nhm,get_timings_nhm},
571{ 0x8086, 0x3404, "5520/5500/X58",setup_nhm, get_fsb_nhm,get_timings_nhm},
572{ 0x8086, 0x3405, "5520/5500/X58",setup_nhm, get_fsb_nhm,get_timings_nhm},
573{ 0x8086, 0x3406, "5520",setup_nhm, get_fsb_nhm,get_timings_nhm},
574{ 0x8086, 0x3407, "5520/5500/X58",setup_nhm, get_fsb_nhm,get_timings_nhm},
575};
576
577static const char *memory_channel_types[] =
578{
579"Unknown", "Single", "Dual", "Triple"
580};
581
582void scan_dram_controller(pci_dt_t *dram_dev)
583{
584int i;
585for(i = 1; i < sizeof(dram_controllers) / sizeof(dram_controllers[0]); i++)
586{
587if ((dram_controllers[i].vendor == dram_dev->vendor_id) && (dram_controllers[i].device == dram_dev->device_id))
588{
589verbose("%s%s DRAM Controller [%4x:%4x] at %02x:%02x.%x\n",
590(dram_dev->vendor_id == 0x8086) ? "Intel Corporation " : "" ,
591dram_controllers[i].name, dram_dev->vendor_id, dram_dev->device_id,
592dram_dev->dev.bits.bus, dram_dev->dev.bits.dev, dram_dev->dev.bits.func);
593
594if (dram_controllers[i].initialise != NULL)
595{
596dram_controllers[i].initialise(dram_dev);
597}
598
599if (dram_controllers[i].poll_timings != NULL)
600{
601dram_controllers[i].poll_timings(dram_dev);
602}
603
604if (dram_controllers[i].poll_speed != NULL)
605{
606dram_controllers[i].poll_speed(dram_dev);
607}
608
609verbose("Frequency detected: %d MHz (%d) %s Channel \n\tCAS:%d tRC:%d tRP:%d RAS:%d (%d-%d-%d-%d)\n",
610(uint32_t)Platform.RAM.Frequency / 1000000,
611(uint32_t)Platform.RAM.Frequency / 500000,
612memory_channel_types[Platform.RAM.Channels]
613,Platform.RAM.CAS, Platform.RAM.TRC, Platform.RAM.TRP, Platform.RAM.RAS
614,Platform.RAM.CAS, Platform.RAM.TRC, Platform.RAM.TRP, Platform.RAM.RAS);
615//getchar();
616}
617}
618}
619

Archive Download this file

Revision: 2329