2 * This file is part of the coreboot project.
4 * Copyright (C) 2009 One Laptop per Child, Association, Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 * part of this file is from cx700 port, part of is from cn700 port,
22 * and acpi_is_wakeup_early_via_VX800() is part of Rudolf's S3 patch
27 #define RAMINIT_SYSINFO 1
28 #define CACHE_AS_RAM_ADDRESS_DEBUG 0
31 #include <device/pci_def.h>
32 #include <device/pci_ids.h>
34 #include <device/pnp_def.h>
35 #include <arch/romcc_io.h>
37 #include "pc80/serial.c"
38 #include "arch/i386/lib/console.c"
39 #include "ram/ramtest.c"
40 #include "northbridge/via/vx800/vx800.h"
41 #include "cpu/x86/mtrr/earlymtrr.c"
42 #include "cpu/x86/bist.h"
43 #include "pc80/udelay_io.c"
44 #include "lib/delay.c"
45 #if CONFIG_USE_INIT == 0
46 #include "lib/memcpy.c"
48 #include "cpu/x86/lapic/boot_cpu.c"
50 /* this file contains the board-special SI value for raminit.c*/
51 #include "mainboard/via/6413e/DrivingClkPhaseData.c"
53 #include "northbridge/via/vx800/raminit.h"
54 #include "northbridge/via/vx800/raminit.c"
55 #include "cpu/x86/car/copy_and_run.c"
56 #include "mainboard/via/6413e/wakeup.h"
58 /* this acpi_is_wakeup_early_via_VX800 is from Rudolf's patch post in maillist in 2008-9-8,
59 http://www.coreboot.org/pipermail/coreboot/2008-January/028787.html.
62 void jason_tsc_count_car(void)
64 unsigned long long start;
65 asm volatile ("rdtsc" : "=A" (start));
67 print_emerg("jason_tsc_count_car= ");
68 print_emerg_hex32((unsigned long) start);
72 int acpi_is_wakeup_early_via_vx800(void) {
76 print_debug("In acpi_is_wakeup_early_via_vx800\r\n");
77 /* Power management controller */
78 dev = pci_locate_device(PCI_ID(PCI_VENDOR_ID_VIA,
79 PCI_DEVICE_ID_VIA_VX855_LPC), 0);
81 if (dev == PCI_DEV_INVALID)
82 die("Power management controller not found\r\n");
84 /* Set ACPI base address to I/O VX800_ACPI_IO_BASE. */
85 pci_write_config16(dev, 0x88, VX800_ACPI_IO_BASE | 0x1);
87 /* Enable ACPI accessm RTC signal gated with PSON. */
88 pci_write_config8(dev, 0x81, 0x84);
90 tmp = inw(VX800_ACPI_IO_BASE + 0x04);
91 result= ((tmp & (7 << 10)) >> 10) == 1 ? 3 : 0;
92 print_debug(" boot_mode=");
93 print_debug_hex16(result);
98 static inline int spd_read_byte(unsigned device, unsigned address)
100 return smbus_read_byte(device, address);
104 /* all content of this function came from the cx700 port of coreboot.
106 static void enable_mainboard_devices(void)
111 #if 0 // add and close this switch, since some line cause error, some written at elsewhere (stage1 stage2),
113 dev = pci_locate_device(PCI_ID(PCI_VENDOR_ID_VIA,
114 PCI_DEVICE_ID_VIA_VX855_LPC), 0);
117 pci_write_config8(dev, 0x98, 0x00);
119 pci_write_config8(dev, 0x50, 0x80);//disable mc97
120 //martin disable internal KBC Configuration
121 pci_write_config8(dev, 0x51, 0x2d); //internal Config is needed to decide which key can be pressed to resume from s3
123 // this cmd cause the irq0 can not be triggerd,since bit 5 was set to 0.
124 //pci_write_config8(dev, 0x58, 0x42);
127 regdata=pci_read_config8(dev, 0x58);
129 pci_write_config8(dev, 0x58,regdata);
130 pci_write_config8(dev, 0x59, 0x80);
131 pci_write_config8(dev, 0x5b, 0x01);
133 print_debug("In enable_mainboard_devices \r\n");
136 Enable P2P Bridge Header for External PCI BUS.
138 dev = pci_locate_device(PCI_ID(0x1106, 0xa353), 0);
139 pci_write_config8(dev, 0x4f, 0x41);
141 /* "5324" already is the default value of PCI ide device, cancel this pci write*/
142 /*[william 20080124]: fix bug that can not boot ubuntu at the begnning time*/
144 dev = pci_locate_device(PCI_ID(0x1106, PCI_DEVICE_ID_VIA_VX855_IDE), 0);
145 values = pci_read_config16(dev, 0xBA);
148 pci_write_config16(dev, 0xBA, values);*/
151 /* most content of this function came from the cx700 port of coreboot.
152 Turn on the shadow of E-seg.
154 static void enable_shadow_ram(void)
157 /*changed the value from 0x2a to 0x3f. "read only" may block "write"?
158 and maybe in C-seg "write" will be needed?*/
159 pci_write_config8(PCI_DEV(0, 0, 3), 0x80, 0xff);
160 /* 0xf0000-0xfffff - ACPI tables */
161 shadowreg = pci_read_config8(PCI_DEV(0, 0, 3), 0x83);
163 pci_write_config8(PCI_DEV(0, 0, 3), 0x83, shadowreg);
164 /* 0xe0000-0xeffff - elfload? */
165 /*in s3 resume process, wakeup.c, I use E-seg to hold the code(which can not locate in the area to be covered) that will copy 0-A-seg and F-seg from TOP-mem back to their normal location.*/
166 pci_write_config8(PCI_DEV(0, 0, 3), 0x82, 0xff);
169 /* Enable shadow ram as normal dram */
170 /* 0xc0000-0xcffff - VGA BIOS */
171 pci_write_config8(PCI_DEV(0, 0, 3), 0x80, 0x2a);
172 pci_write_config8(PCI_DEV(0, 0, 7), 0x61, 0x00);
173 /* 0xd0000-0xdffff - ?? */
174 //pci_write_config8(PCI_DEV(0, 0, 3), 0x81, 0xff);
175 //pci_write_config8(PCI_DEV(0, 0, 7), 0x62, 0xff);
177 /* Do it again for the vlink controller */
178 shadowreg = pci_read_config8(PCI_DEV(0, 0, 7), 0x63);
180 pci_write_config8(PCI_DEV(0, 0, 7), 0x63, shadowreg);
185 /*added this table 2008-11-28,
186 this table contains the value needed to be set before begin to init dram.
187 Note: REV_Bx should be checked for changes when porting a new board!!!!! */
188 static const struct VIA_PCI_REG_INIT_TABLE mNbStage1InitTbl[]= {
190 0x00, 0xFF, NB_APIC_REG(0x61), 0xFF, 0x0E, // Set Exxxxxxx as pcie mmio config range
191 0x00, 0xFF, NB_APIC_REG(0x60), 0xF4, 0x0B, // Support extended cfg address of pcie
192 //0x00, 0xFF, NB_APIC_REG(0x42), 0xF9, 0x02, // APIC Interrupt((BT_INTR)) Control
193 // Set ROMSIP value by software
195 /*0x00, 0xFF, NB_HOST_REG(0x70), 0x77, 0x33, // 2x Host Adr Strobe/Pad Pullup Driving = 3
196 0x00, 0xFF, NB_HOST_REG(0x71), 0x77, 0x33, // 2x Host Adr Strobe/Pad Pulldown Driving = 3
197 0x00, 0xFF, NB_HOST_REG(0x72), 0x77, 0x33, // 4x Host Dat Strobe/Pad Pullup Driving = 3
198 0x00, 0xFF, NB_HOST_REG(0x73), 0x77, 0x33, // 4x Host Dat Strobe/Pad Pulldown Driving = 3
199 0x00, 0xFF, NB_HOST_REG(0x74), 0xFF, 0x21, // Memory I/F timing ctrl
200 0x00, 0xFF, NB_HOST_REG(0x74), 0xFF, 0xE1, // Memory I/F timing ctrl
201 0x00, 0xFF, NB_HOST_REG(0x75), 0xFF, 0x18, // AGTL+ I/O Circuit
202 0x00, 0xFF, NB_HOST_REG(0x76), 0xFB, 0x0C, // AGTL+ Compensation Status
203 0x00, 0xFF, NB_HOST_REG(0x78), 0xFF, 0x33, // 2X AGTL+ Auto Compensation Offset
204 0x00, 0xFF, NB_HOST_REG(0x79), 0xFF, 0x33, // 4X AGTL+ Auto Compensation Offset
205 0x00, 0xFF, NB_HOST_REG(0x7A), 0x3F, 0x72, // AGTL Compensation Status
206 0x00, 0xFF, NB_HOST_REG(0x7A), 0x3F, 0x77, // AGTL Compensation Status
207 0x00, 0xFF, NB_HOST_REG(0x7B), 0xFF, 0x44, // Input Host Address / Host Strobe Delay Control for HA Group
208 0x00, 0xFF, NB_HOST_REG(0x7B), 0xFF, 0x22, // Input Host Address / Host Strobe Delay Control for HA Group
209 0x00, 0xFF, NB_HOST_REG(0x7C), 0xFF, 0x00, // Output Delay Control of PAD for HA Group
210 0x00, 0xFF, NB_HOST_REG(0x7D), 0xFF, 0xAA, // Host Address / Address Clock Output Delay Control (Only for P4 Bus)
211 0x00, 0xFF, NB_HOST_REG(0x7E), 0xFF, 0x10, // Host Address CKG Rising / Falling Time Control (Only for P4 Bus)
212 0x00, 0xFF, NB_HOST_REG(0x7E), 0xFF, 0x40, // Host Address CKG Rising / Falling Time Control (Only for P4 Bus)
213 0x00, 0xFF, NB_HOST_REG(0x7F), 0xFF, 0x10, // Host Address CKG Rising / Falling Time Control (Only for P4 Bus)
214 0x00, 0xFF, NB_HOST_REG(0x7F), 0xFF, 0x40, // Host Address CKG Rising / Falling Time Control (Only for P4 Bus)
215 0x00, 0xFF, NB_HOST_REG(0x80), 0x3F, 0x44, // Host Data Receiving Strobe Delay Ctrl 1
216 0x00, 0xFF, NB_HOST_REG(0x81), 0xFF, 0x44, // Host Data Receiving Strobe Delay Ctrl 2
217 0x00, 0xFF, NB_HOST_REG(0x82), 0xFF, 0x00, // Output Delay of PAD for HDSTB
218 0x00, 0xFF, NB_HOST_REG(0x83), 0xFF, 0x00, // Output Delay of PAD for HD
219 0x00, 0xFF, NB_HOST_REG(0x84), 0xFF, 0x44, // Host Data / Strobe CKG Control (Group 0)
220 0x00, 0xFF, NB_HOST_REG(0x85), 0xFF, 0x44, // Host Data / Strobe CKG Control (Group 1)
221 0x00, 0xFF, NB_HOST_REG(0x86), 0xFF, 0x44, // Host Data / Strobe CKG Control (Group 2)
222 0x00, 0xFF, NB_HOST_REG(0x87), 0xFF, 0x44, // Host Data / Strobe CKG Control (Group 3)*/
225 // CPU Host Bus Control
226 0x00, 0xFF, NB_HOST_REG(0x50), 0x1F, 0x08, // Request phase ctrl: Dynamic Defer Snoop Stall Count = 8
227 //0x00, 0xFF, NB_HOST_REG(0x51), 0xFF, 0x7F, // CPU I/F Ctrl-1: Disable Fast DRDY and RAW
228 0x00, 0xFF, NB_HOST_REG(0x51), 0xFF, 0x7C, // CPU I/F Ctrl-1: Disable Fast DRDY and RAW
229 0x00, 0xFF, NB_HOST_REG(0x52), 0xCB, 0xCB, // CPU I/F Ctrl-2: Enable all for performance
230 //0x00, 0xFF, NB_HOST_REG(0x53), 0xFF, 0x88, // Arbitration: Host/Master Occupancy timer = 8*4 HCLK
231 0x00, 0xFF, NB_HOST_REG(0x53), 0xFF, 0x44, // Arbitration: Host/Master Occupancy timer = 4*4 HCLK
232 0x00, 0xFF, NB_HOST_REG(0x54), 0x1E, 0x1C, // Misc Ctrl: Enable 8QW burst Mem Access
233 //0x00, 0xFF, NB_HOST_REG(0x55), 0x06, 0x06, // Miscellaneous Control 2
234 0x00, 0xFF, NB_HOST_REG(0x55), 0x06, 0x04, // Miscellaneous Control 2
235 0x00, 0xFF, NB_HOST_REG(0x56), 0xF7, 0x63, // Write Policy 1
236 //0x00, 0xFF, NB_HOST_REG(0x59), 0x3D, 0x01, // CPU Miscellaneous Control 1, enable Lowest-Priority IPL
237 //0x00, 0xFF, NB_HOST_REG(0x5c), 0xFF, 0x00, // CPU Miscellaneous Control 2
238 0x00, 0xFF, NB_HOST_REG(0x5D), 0xFF, 0xA2, // Write Policy
239 0x00, 0xFF, NB_HOST_REG(0x5E), 0xFF, 0x88, // Bandwidth Timer
240 0x00, 0xFF, NB_HOST_REG(0x5F), 0x46, 0x46, // CPU Misc Ctrl
241 // 0x00, 0xFF, NB_HOST_REG(0x90), 0xFF, 0x0B, // CPU Miscellaneous Control 3
242 //0x00, 0xFF, NB_HOST_REG(0x96), 0x0B, 0x0B, // CPU Miscellaneous Control 2
243 0x00, 0xFF, NB_HOST_REG(0x96), 0x0B, 0x0A, // CPU Miscellaneous Control 2
244 0x00, 0xFF, NB_HOST_REG(0x98), 0xC1, 0x41, // CPU Miscellaneous Control 3
245 0x00, 0xFF, NB_HOST_REG(0x99), 0x0E, 0x06, // CPU Miscellaneous Control 4
248 // Set APIC and SMRAM
249 0x00, 0xFF, NB_HOST_REG(0x97), 0xFF, 0x00, // APIC Related Control
250 0x00, 0xFF, NB_DRAMC_REG(0x86), 0xD6, 0x29, // SMM and APIC Decoding: enable APIC, MSI and SMRAM A-Seg
251 0x00, 0xFF, 0x00, 0x00, 0x00,0x00, 0x00, 0x00 // End of the table
254 #define USE_VCP 1//0 means use DVP
258 #define gCom1Base 0x3f8
259 #define gCom2Base 0x2f8
265 //enable NB multiple function control
266 ByteVal = pci_read_config8(PCI_DEV(0, 0, 0), 0x4f);
267 ByteVal = ByteVal |0x01;
268 pci_write_config8(PCI_DEV(0, 0, 0), 0x4f, ByteVal);
271 ByteVal = pci_read_config8(PCI_DEV(0, 0, 3), 0xA1);
272 ByteVal = ByteVal |0x80;
273 pci_write_config8(PCI_DEV(0, 0, 3), 0xA1, ByteVal);
275 ByteVal = pci_read_config8(PCI_DEV(0, 0, 3), 0xA7);
276 ByteVal = ByteVal |0x08;
277 pci_write_config8(PCI_DEV(0, 0, 3), 0xA7, ByteVal);
280 ByteVal = pci_read_config8(PCI_DEV(0, 1, 0), 0x4);
281 ByteVal = ByteVal |0x07;
282 pci_write_config8(PCI_DEV(0, 1, 0), 0x4, ByteVal);
284 //Turn on Graphic chip IO port port access
285 ByteVal = inb(0x3C3);
286 ByteVal = ByteVal |0x01;
289 //Turn off Graphic chip Register protection
291 ByteVal = inb(0x3C5);
292 ByteVal = ByteVal |0x01;
295 //south module pad share enable 0x3C5.78[7]
297 ByteVal = inb(0x3C5);
298 ByteVal = ByteVal |0x80;
301 //enable UART Function multiplex with DVP or VCP pad D17F0Rx46[7,6]
302 ByteVal = pci_read_config8(PCI_DEV(0, 17, 0), 0x46);
305 ByteVal = (ByteVal & 0x3F) | 0x40;
308 ByteVal = (ByteVal & 0x3F) | 0xC0;
309 pci_write_config8(PCI_DEV(0, 17, 0), 0x46, ByteVal);
313 //enable embeded com1 and com2 D17F0RxB0[5,4]
314 ByteVal = pci_read_config8(PCI_DEV(0, 17, 0), 0xB0);
315 ByteVal = ByteVal & 0xcf;
318 ByteVal = ByteVal | 0x10;
320 ByteVal = ByteVal | 0x20;
321 pci_write_config8(PCI_DEV(0, 17, 0), 0xB0, ByteVal);
330 //set embeded com1 IO base = 0x3E8
334 ByteVal = (u8)((gCom1Base >> 3) |0x80);
335 pci_write_config8(PCI_DEV(0, 17, 0), 0xB4, ByteVal);
336 ByteVal = pci_read_config8(PCI_DEV(0, 17, 0), 0xb2);
337 ByteVal = (ByteVal&0xf0)|0x04;
338 pci_write_config8(PCI_DEV(0, 17, 0), 0xB2, ByteVal);
341 //set embeded com2 IO base = 0x2E8
345 ByteVal = (u8)((gCom2Base >> 3) |0x80);
346 pci_write_config8(PCI_DEV(0, 17, 0), 0xB5, ByteVal);
347 ByteVal = pci_read_config8(PCI_DEV(0, 17, 0), 0xb2);
348 ByteVal = (ByteVal&0x0f)|0x30;
349 pci_write_config8(PCI_DEV(0, 17, 0), 0xB2, ByteVal);
352 //no port 80 biger then 0x10
355 ByteVal = inb(ComBase + 3);
356 outb(ByteVal & 0x7F,ComBase + 3);
357 outb( 0x00,ComBase + 1);
360 ByteVal = inb(ComBase + 3);
361 outb( ByteVal | 0x80,ComBase + 3);
363 outb(0x00,ComBase + 1 );
366 ByteVal = inb(ComBase + 3);
367 outb( ByteVal & 0x3F,ComBase + 3);
368 outb(0x03,ComBase + 3 );
369 outb(0x00,ComBase + 2);
370 outb(0x00,ComBase + 4);
372 //SOutput("Embeded com output\n");
376 /*cache_as_ram.inc jump to here
378 void amd64_main(unsigned long bist)
379 { unsigned cpu_reset = 0;
384 /* Enable multifunction for northbridge. These 4 lines(until console_init();) are the same with epia-cn port.*/
385 pci_write_config8(PCI_DEV(0, 0, 0), 0x4f, 0x01);
387 //enable_vx800_serial();
420 jason_tsc_count_car();
421 pci_write_config16(PCI_DEV(0, 0xf, 0), 0xBA, PCI_DEVICE_ID_VIA_VX855_IDE);
422 pci_write_config16(PCI_DEV(0, 0xf, 0), 0xBE, PCI_DEVICE_ID_VIA_VX855_IDE);
423 pci_write_config16(PCI_DEV(0, 0x11, 0), 0xA0, PCI_VENDOR_ID_VIA);
424 pci_write_config16(PCI_DEV(0, 0x11, 0), 0xA2, PCI_DEVICE_ID_VIA_VX855_LPC);
425 Data8=pci_read_config8(PCI_DEV(0, 0x11, 0),0x79);
428 pci_write_config8(PCI_DEV(0, 0x11, 0),0x79,Data8);
429 pci_write_config16(PCI_DEV(0, 0x11, 0), 0x72, PCI_DEVICE_ID_VIA_VX855_LPC);
431 console_init();//there are to function defination of console_init(), while the src/archi386/lib is the right one.
433 /* decide if this is a s3 wakeup or a normal boot*/
434 boot_mode=acpi_is_wakeup_early_via_vx800();
435 /* 2008-11-27 add this, to transfer "cpu restart" to "cold boot"
436 When this boot is not a S3 resume, and PCI registers had been written,
437 then this must be a cpu restart(result of os reboot cmd), so we need a real "cold boot".*/
438 jason_tsc_count_car();
439 if((boot_mode!=3)&&(pci_read_config8(PCI_DEV(0, 0, 3), 0x80)!=0))
440 {outb(6, 0xcf9);} /*x86 cold boot I/O cmd*/
442 /* this 2 lines is the same with epia-cn port.*/
444 jason_tsc_count_car();
445 //smbus_fixup(&ctrl);// this fix does help vx800!, but vx855 doesn't need this
448 //CAR need mtrr untill mem is ok, so i disable this early_mtrr_init();
449 //print_debug("doing early_mtrr\r\n");
453 /* Halt if there was a built-in self test failure. */
454 report_bist_failure(bist);
456 print_debug("Enabling mainboard devices\r\n");
457 enable_mainboard_devices();
461 /*2008-11-27 Get NB Chip revision from D0F4RxF6, revision will be used in via_pci_inittable*/
462 device=PCI_DEV(0, 0, 4);
463 Data=pci_read_config8(device,0xf6);
464 print_debug("NB chip revision =");
465 print_debug_hex8(Data);
467 /*2008-11-27, make NB ready before draminit*/
468 via_pci_inittable(Data,mNbStage1InitTbl);
470 /*2008-11-27 add this.
471 When resume from s3, draminit is skiped, so need to recovery any PCI register related to draminit. d0f3 didnt lose its Power during whole s3 time, so any register not belonging to d0f3 needs to be recovered .*/
475 u8 ramregs[] = {0x43, 0x42, 0x41, 0x40};
476 DRAM_SYS_ATTR DramAttr;
478 print_debug("This is a S3 wakeup\r\n");
480 memset (&DramAttr, 0,sizeof (DRAM_SYS_ATTR));
481 /*Step1 DRAM Detection; DDR1 or DDR2; Get SPD Data; Rank Presence;64 or 128bit; Unbuffered or registered; 1T or 2T*/
482 DRAMDetect(&DramAttr);
484 /*begin to get ram size, 43,42 41 40 contains the end address of last rank in ddr2-slot*/
485 device=PCI_DEV(0, 0, 3);
486 for(rambits = 0, i = 0; i < ARRAY_SIZE(ramregs); i++) {
487 rambits = pci_read_config8(device, ramregs[i]);
492 DRAMDRDYSetting (&DramAttr);
494 Data = 0x80;//this value is same with DevInit.c
495 pci_write_config8(PCI_DEV(0,0,4), 0xa3, Data);
496 pci_write_config8(PCI_DEV(0,17,7), 0x60, rambits<<2);
497 Data=pci_read_config8(MEMCTRL, 0x88);
498 pci_write_config8(PCI_DEV(0,17,7), 0xE5, Data);
500 DRAMRegFinalValue(&DramAttr); //Just copy this function from draminit to here!
501 SetUMARam();//Just copy this function from draminit to here!
502 print_debug("Resume from S3, RAM init was ignored\r\n");
506 ram_check(0, 640 * 1024);
510 /*2008-11-27 this line is the same with cx700 port .*/
513 jason_tsc_count_car();
515 For coreboot most time of S3 resume is the same as normal boot, so some memory area under 1M become dirty,
516 so before this happen, I need to backup the content of mem to top-mem.
517 I will reserve the 1M top-men in LBIO table in coreboot_table.c and recovery the content of 1M-mem in wakeup.c
519 #if PAYLOAD_IS_SEABIOS==1 //
521 /* An Idea of Libo.Feng at amd.com in http://www.coreboot.org/pipermail/coreboot/2008-December/043111.html
522 I want move the 1M data, I have to set some MTRRs myself.*/
523 /*Setting mtrr before back memoy save s3 resume time about 0.14 seconds*/
524 /*!!!!!!!!Since CAR stack uses cache, and we are using cache here, we must be careful,
525 1 during these mtrr code, must no function call, (after this mtrr, I think it should be ok to use function)
526 2 before stack switch, no use variable that have value set before this
527 3 due to 2, take care of "cpu_reset", I directlly set it to ZERO.
529 u32 memtop=*(u32*)WAKE_MEM_INFO;
530 u32 memtop1=*(u32*)WAKE_MEM_INFO-0x100000;
531 u32 memtop2=*(u32*)WAKE_MEM_INFO-0x200000;
532 u32 memtop3=*(u32*)WAKE_MEM_INFO- 64*1024-0x100000;
533 u32 memtop4=*(u32*)WAKE_MEM_INFO- 64*1024-0x100000+0xe0000;
534 /* __asm__ volatile (
535 "movl $0x204, %%ecx\n\t"
536 "xorl %%edx, %%edx\n\t"
538 "orl $(0 | 6), %%eax\n\t"
541 "movl $0x205, %%ecx\n\t"
542 "xorl %%edx, %%edx\n\t"
543 "movl $0x100000,%%eax\n\t"
546 "orl $(0 | 0x800), %%eax\n\t"
551 "movl $0x206, %%ecx\n\t"
552 "xorl %%edx, %%edx\n\t"
554 "orl $(0 | 6), %%eax\n\t"
557 "movl $0x207, %%ecx\n\t"
558 "xorl %%edx, %%edx\n\t"
559 "movl $0x100000,%%eax\n\t"
562 "orl $(0 | 0x800), %%eax\n\t"
567 "movl $0x208, %ecx\n\t"
568 "xorl %edx, %edx\n\t"
570 "orl $(0 | 6), %eax\n\t"
573 "movl $0x209, %ecx\n\t"
574 "xorl %edx, %edx\n\t"
575 "movl $0x100000,%eax\n\t"
578 "orl $(0 | 0x800), %eax\n\t"
582 // WAKE_MEM_INFO is inited in get_set_top_available_mem in tables.c
583 // these two memcpy not not be enabled if set the MTRR around this two lines.
587 "movl $0xa0000, %%ecx\n\t"
593 "movl $0xe0000, %%esi\n\t"
595 "movl $0x20000, %%ecx\n\t"
600 print_debug("copy memory to high memory to protect s3 wakeup vector code \r\n");//this can have function call, because no variable used before this
601 memcpy((unsigned char *)((*(u32*)WAKE_MEM_INFO) - 64*1024-0x100000),(unsigned char *)0,0xa0000);
602 memcpy((unsigned char *)((*(u32*)WAKE_MEM_INFO) - 64*1024-0x100000+0xe0000),(unsigned char *)0xe0000,0x20000);
604 /* restore the MTRR previously modified. */
605 /* __asm__ volatile (
607 "xorl %edx, %edx\n\t"
608 "xorl %eax, %eax\n\t"
609 "movl $0x204, %ecx\n\t"
611 "movl $0x205, %ecx\n\t"
613 "movl $0x206, %ecx\n\t"
615 "movl $0x207, %ecx\n\t"
617 "movl $0x208, %ecx\n\t"
619 "movl $0x209, %ecx\n\t"
625 the following code is copied from src\mainboard\tyan\s2735\cache_as_ram_auto.c
626 Only the code around CLEAR_FIRST_1M_RAM is changed.
627 Removed all the code around CLEAR_FIRST_1M_RAM and #include "cpu/x86/car/cache_as_ram_post.c"
628 the CLEAR_FIRST_1M_RAM seems to make cpu/x86/car/cache_as_ram_post.c stop at somewhere,
629 and cpu/x86/car/cache_as_ram_post.c do not cache my $XIP_ROM_BASE+SIZE area.
631 Uuse: #include "cpu/via/car/cache_as_ram_post.c". this version post.c have some diff withx86-version
635 /* Check value of esp to verify if we have enough rom for stack in Cache as RAM */
642 printk_debug("v_esp=%08x\r\n", v_esp);
644 print_debug("v_esp="); print_debug_hex32(v_esp); print_debug("\r\n");
652 // it seems that cpu_reset is not used before this, so I just reset it, (this is because the s3 resume, setting in mtrr and copy data may destroy
656 printk_debug("cpu_reset = %08x\r\n",cpu_reset);
658 print_debug("cpu_reset = "); print_debug_hex32(cpu_reset); print_debug("\r\n");
662 print_debug("Clearing initial memory region: ");
664 print_debug("No cache as ram now - ");
666 /* store cpu_reset to ebx */
673 /* Cancel these lines, CLEAR_FIRST_1M_RAM cause the cpu/x86/car/cache_as_ram_post.c stop at somewhere
676 #define CLEAR_FIRST_1M_RAM 1
677 #include "cpu/via/car/cache_as_ram_post.c"
680 #undef CLEAR_FIRST_1M_RAM
681 #include "cpu/via/car/cache_as_ram_post.c"
684 #include "cpu/via/car/cache_as_ram_post.c"
685 //#include "cpu/x86/car/cache_as_ram_post.c"
687 /* set new esp */ /* before _RAMBASE */
690 ::"a"( (DCACHE_RAM_BASE + DCACHE_RAM_SIZE)- _RAMBASE)
694 unsigned new_cpu_reset;
696 /* get back cpu_reset from ebx */
699 :"=a" (new_cpu_reset)
702 /* We can not go back any more, we lost old stack data in cache as ram*/
703 if(new_cpu_reset==0) {
704 print_debug("Use Ram as Stack now - done\r\n");
707 print_debug("Use Ram as Stack now - \r\n");
710 printk_debug("new_cpu_reset = %08x\r\n", new_cpu_reset);
712 print_debug("new_cpu_reset = "); print_debug_hex32(new_cpu_reset); print_debug("\r\n");
714 jason_tsc_count_car();
715 /*copy and execute coreboot_ram */
716 copy_and_run(new_cpu_reset);
717 /* We will not return */
722 print_debug("should not be here -\r\n");