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; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 #if CONFIG_HAVE_ACPI_RESUME == 1
22 #include <arch/acpi.h>
24 #include <../northbridge/via/vx800/vx800.h>
27 #include "pci_rawops.h"
29 static const struct VIA_PCI_REG_INIT_TABLE mSbStage1InitTbl[] = {
30 // Combine Stage1 registers
31 {0x00, 0xFF, SB_LPC_REG(0x41), 0x40, 0x40},
33 // Acpi init registers in sb stage1
34 {0x00, 0xFF, SB_LPC_REG(0x40), 0x04, 0x04}, // Enable 4D0/4D1 support
35 {0x00, 0xFF, SB_LPC_REG(0x4E), 0x00, 0x08}, // Enable RTC port 74/75
36 {0x00, 0xFF, SB_LPC_REG(0x51), 0x0D, 0x0D}, // and KBC
37 {0x00, 0xFF, SB_LPC_REG(0x52), 0x0F, 0x09}, // Enable Serial IRQ
38 {0x00, 0xFF, SB_LPC_REG(0x67), 0x00, 0x04}, // Set FERR voltage to 1.5v
39 {0x00, 0xFF, SB_LPC_REG(0x98), 0xFF, 0x00}, // Disable GP3 Timer
41 {0x00, 0xFF, SB_IDEC_REG(0xb9), 0x01, 0x01},
43 {0x00, 0xFF, SB_VLINK_REG(0xE6), 0xFF, 0x39}, // Enable SMM A-Seg, MSI and Io APIC
45 //// SPI_BASE_ADDRESS = 0xFED1 0000
46 0x00, 0xFF, SB_LPC_REG(0xBC), 0xFF, 0x00,
47 0x00, 0xFF, SB_LPC_REG(0xBD), 0xFF, 0xD1,
48 0x00, 0xFF, SB_LPC_REG(0xBE), 0xFF, 0xFE,
49 // 0x00, 0xFF, ((0x11<<16)|(0x00<<8)|0xBC), 0xFF, 0x00,//this , for the different macro
50 // 0x00, 0xFF, ((0x11<<16)|(0x00<<8)|0xBD), 0xFF, 0xD1,
51 // 0x00, 0xFF, ((0x11<<16)|(0x00<<8)|0xBE), 0xFF, 0xFE,
52 ///// End of 2008-04-17
54 {0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // End of Table
57 static const struct VIA_PCI_REG_INIT_TABLE mNbStage2InitTable[] = {
58 // D0F0: AGP Feature. For 3353, No AGP Feature
60 // D0F2~D0F3 is configured by MemoryInit Peim
63 0x00, 0xFF, NB_PMU_REG(0x84), 0x00, 0xDB,
64 0x00, 0xFF, NB_PMU_REG(0x85), 0x00, 0x05,
65 0x00, 0xFF, NB_PMU_REG(0x89), 0x00, 0xF8,
66 0x00, 0xFF, NB_PMU_REG(0x8B), 0x00, 0xBF,
67 0x00, 0xFF, NB_PMU_REG(0x8D), 0x00, 0xFC,
68 0x00, 0xFF, NB_PMU_REG(0x8E), 0x00, 0x19,
69 0x00, 0xFF, NB_PMU_REG(0x8F), 0x03, 0x00,
70 0x00, 0xFF, NB_PMU_REG(0x90), 0x00, 0xFF,
71 0x00, 0xFF, NB_PMU_REG(0x91), 0x00, 0xFF,
72 0x00, 0xFF, NB_PMU_REG(0x92), 0x00, 0xCC,
73 0x00, 0xFF, NB_PMU_REG(0xA0), 0x00, 0x80,
74 0x00, 0xFF, NB_PMU_REG(0xA1), 0x00, 0xE0,
75 0x00, 0xFF, NB_PMU_REG(0xA2), 0x00, 0xD6,
76 0x00, 0xFF, NB_PMU_REG(0xA3), 0x00, 0x80,
77 0x00, 0xFF, NB_PMU_REG(0xA8), 0x00, 0x20,
79 // D0F5: NB APIC, PXPTRF and MSGC
80 //Note: the Rx6A, RCRBH Base Address, is not set, which is related to PCIE Root Complex.
81 //Note: the Rx60, Extended CFG Address. Support and Rx61, Extended CFG Address, are set by NB Peim that is in the PEI Phase.
82 //Note: the Rx42, APIC Interrupt((BT_INTR)) Control, is set by NB Peim that is in PEI phase.
83 0x00, 0xFF, NB_PXPTRF_REG(0x50), 0x00, 0x00,
84 0x00, 0xFF, NB_PXPTRF_REG(0x54), 0x00, 0x80,
85 0x00, 0xFF, NB_PXPTRF_REG(0x55), 0x00, 0x04,
86 0x00, 0xFF, NB_PXPTRF_REG(0x58), 0x00, 0x00,
87 0x00, 0xFF, NB_PXPTRF_REG(0x59), 0x00, 0x02,
88 0x00, 0xFF, NB_PXPTRF_REG(0x5E), 0x00, 0x00,
89 0x00, 0xFF, NB_PXPTRF_REG(0x5F), 0x00, 0x06,
90 0x00, 0xFF, NB_PXPTRF_REG(0x80), 0x00, 0x18, //Set RVC1DM, RTHBHIT, RUWRDYD, RUPRRDY1, RUWPOPHD to 1.
91 0x00, 0xFF, NB_PXPTRF_REG(0x82), 0x00, 0x00, //Set RVC1RPSW, RVC1RQ1T to 1.
92 0x00, 0xFF, NB_PXPTRF_REG(0x83), 0x00, 0x81,
93 0x00, 0xFF, NB_PXPTRF_REG(0x84), 0x00, 0x28,
94 0x00, 0xFF, NB_PXPTRF_REG(0x85), 0x00, 0xC0,
95 0x00, 0xFF, NB_MSGC_REG(0xA3), 0x00, 0x01, // RWAKEEN
96 // 0x00, 0xFF, NB_PXPTRF_REG(0x64), 0x40, 0x00, //RTDNP2B32EN
97 0x00, 0xFF, NB_PXPTRF_REG(0xF3), 0xFC, 0x20,
98 0x00, 0xFF, NB_PXPTRF_REG(0x85), 0x00, 0x00, //RP2P1ABORT
102 // If no settings, C7 will hang or reboot in XP, but CN will not.
103 0x00, 0xFF, NB_HOST_REG(0x51), 0x84, 0x00,
104 0x00, 0xFF, NB_HOST_REG(0x52), 0x0F, 0x03,
105 0x00, 0xFF, NB_HOST_REG(0x54), 0x04, 0x00,
106 0x00, 0xFF, NB_HOST_REG(0x55), 0x04, 0x00,
107 0x00, 0xFF, NB_HOST_REG(0x59), 0x09, 0x01,
108 0x00, 0xFF, NB_HOST_REG(0x5C), 0x10, 0x10,
109 0x00, 0xFF, NB_HOST_REG(0x5F), 0x0E, 0x08,
110 0x00, 0xFF, NB_HOST_REG(0x92), 0xFF, 0x04, // ACPI Base addr
111 0x00, 0xFF, NB_HOST_REG(0x97), 0x01, 0x01, // APIC MSI
112 0x00, 0xFF, NB_HOST_REG(0x99), 0x02, 0x00, // APIC MSI
114 0x00, 0xFF, NB_HOST_REG(0x73), 0xFF, 0x66,
115 0x00, 0xFF, NB_HOST_REG(0xB2), 0xFF, 0x33,
116 0x00, 0xFF, NB_HOST_REG(0xB3), 0xFF, 0x33,
117 0x00, 0xFF, NB_HOST_REG(0xBC), 0xFF, 0x33,
118 0x00, 0xFF, NB_HOST_REG(0xBD), 0xFF, 0x33,
119 0x00, 0xFF, NB_HOST_REG(0xC5), 0x30, 0x20,
120 0x00, 0xFF, NB_HOST_REG(0xC8), 0x10, 0x00,
124 {0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // End of Table
128 static const struct VIA_PCI_REG_INIT_TABLE mBusControllerInitTable[] = {
130 0x00, 0xFF, SB_LPC_REG(0x40), 0x44, 0x44, // Enable I/O Recovery Time, 4D0/4D1 Support
131 0x00, 0xFF, SB_LPC_REG(0x42), 0xF8, 0xF0, // ENLBUF, GINTREN, FLUSHEN, RBRSTRD
132 0x00, 0xFF, SB_LPC_REG(0x43), 0x0F, 0x0B, // RENDTX, ENWBTO, ENRBTO
133 // 0x00, 0xFF, SB_LPC_REG(0x46), 0x00, 0x10, // It is related to INTH#
134 //0x00, 0xFF, SB_LPC_REG(0x48), 0x00, 0x0C, //RMRPW, RIRPW // Reserved in 409 by Eric
136 // Internal RTC, Mouse, Keyboard // set in PEI by Eric
137 //0x00, 0xFF, SB_LPC_REG(0x51), 0x10, 0x0D, // Enable Internal RTC, Internal PS2 Mouse/Keyboard
140 0x00, 0xFF, SB_LPC_REG(0x58), 0x00, 0x01, //RTC Rx32 Map to Centrury Byte
142 // 0x00, 0xFF, SB_LPC_REG(0x40), 0x00, 0x02, // RDMEGAS
143 //0x00, 0xFF, SB_LPC_REG(0x4E), 0x00, 0x08, // Enable RTC port 74/75, ENEXRTC // set in PEI by Eric
145 // Serial IRQ // set in PEI by Eric
146 //0x00, 0xFF, SB_LPC_REG(0x52), 0x0F, 0x09, // Enable Serial IRQ, Start Frame Width is 6 PCI Clock.
148 // Enable 4D0h/4D1h Port
149 //0x00, 0xFF, SB_LPC_REG(0x40), 0x00, 0x04, // EISAXT // set in PEI by Eric
151 // Config ROM Interface
152 // Enable SPI/Set SPI Memory Base Address
153 // It is initialized in PEI Phase
155 // Subsystem ID/Vendor ID Back Door
156 0x00, 0xFF, SB_LPC_REG(0x70), 0xFF, 0x06,
157 0x00, 0xFF, SB_LPC_REG(0x71), 0xFF, 0x11,
158 0x00, 0xFF, SB_LPC_REG(0x72), 0xFF, 0x09,
159 0x00, 0xFF, SB_LPC_REG(0x73), 0xFF, 0x34,
161 0x00, 0xFF, SB_LPC_REG(0x4C), 0xC0, 0x40,
162 0x00, 0xFF, SB_LPC_REG(0x5B), 0x00, 0x51, // Orgin value 0x53, modify for 409 by Eric
163 0x00, 0xFF, SB_LPC_REG(0x67), 0x03, 0x01,
166 0x00, 0xFF, SB_LPC_REG(0x50), 0x7E, 0x00, // Setting PCI device enable
167 0x00, 0xFF, SB_LPC_REG(0x51), 0xD0, 0x00, // Setting PCI device enable
168 0x00, 0xFF, SB_VLINK_REG(0xD1), 0x04, 0x00, // Setting HDAC enable
169 {0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // End of Table
172 static const struct VIA_PCI_REG_INIT_TABLE mPCI1InitTable[] = {
173 //PCI1 Programming Sequence
175 0x00, 0xFF, SB_VLINK_REG(0x04), 0x00, 0x03,
176 0x00, 0xFF, SB_VLINK_REG(0x0C), 0x00, 0x08, // Reserved in 409 by Eric
177 0x00, 0xFF, SB_VLINK_REG(0x4F), 0x40, 0x41, //RENPPB, RP2CFLSH
178 0x00, 0xFF, SB_VLINK_REG(0x77), 0x00, 0x48, //ROP2CFLSH, RFFTMR[1:0]. ROP2CFLSH work with Rx4F[0](RP2CFLSH) assertion
179 // 0x00, 0xFF, SB_VLINK_REG(0x51), 0x00, 0x80, //RSUB_DEC_P2P, RSUBDECOD(Window xp). If Bit7 is set, PCI lock will occured.
180 //0x00, 0xFF, SB_VLINK_REG(0x51), 0x00, 0x81, //RSUB_DEC_P2P, RSUBDECOD(Window Vista)
182 0x00, 0xFF, SB_P2PB_REG(0x04), 0x00, 0x07,
184 //(3)Performance Recommended Setting
187 0x00, 0xFF, SB_VLINK_REG(0xE2), 0x1F, 0x01,
188 0x00, 0xFF, SB_VLINK_REG(0xE3), 0xF1, 0x5E,
189 0x00, 0xFF, SB_VLINK_REG(0x74), 0x40, 0x00,
190 //Enhence Host To PCI cycle performance and PCI-To-Host Cycle performance
191 0x00, 0xFF, SB_VLINK_REG(0x70), 0x00, 0x82,
192 0x00, 0xFF, SB_VLINK_REG(0x71), 0x30, 0xC0,
193 0x00, 0xFF, SB_VLINK_REG(0x72), 0x00, 0xEE,
196 0x00, 0xFF, SB_VLINK_REG(0x73), 0x00, 0x01,
197 0x00, 0xFF, SB_VLINK_REG(0x74), 0x00, 0x0C,
198 //Arbitration control
199 0x00, 0xFF, SB_VLINK_REG(0x75), 0x00, 0x0F,
200 0x00, 0xFF, SB_VLINK_REG(0x76), 0x00, 0xD0,
201 {0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // End of Table
204 static const struct VIA_PCI_REG_INIT_TABLE mCCAInitTable[] = {
206 0x00, 0xFF, SB_VLINK_REG(0xFC), 0x02, 0x08, //RVWREQ, ROABKDOOR
208 //CCA's Register Programming sequence
209 0x00, 0xFF, SB_VLINK_REG(0x50), 0x00, 0x08, //Config Azalia's upstream cycle high priority and other low priority
210 0x00, 0xFF, SB_VLINK_REG(0x51), 0x40, 0x80, //Disable bypass asynchronous circuit
211 0x00, 0xFF, SB_VLINK_REG(0x52), 0x00, 0x11, // Set SM Internal Device and HDAC Occupy Timer
212 0x00, 0xFF, SB_VLINK_REG(0x53), 0x00, 0x11, // Set SM Internal Device and HDAC Promote Timer
213 0x00, 0xFF, SB_VLINK_REG(0x54), 0xFF, 0x02, //Use SB internal devices's original REQ
214 0x00, 0xFF, SB_VLINK_REG(0x73), 0x10, 0x00, //RPINOWSC. Enable APIC Cycle Block P2C Write Cycle
215 0x00, 0xFF, SB_VLINK_REG(0x74), 0x00, 0x3C, //RLCKXP2C, RFSBVK.
216 0x00, 0xFF, SB_VLINK_REG(0xE1), 0x07, 0x00, //RBLKAPIC, RAZC3
217 0x00, 0xFF, SB_VLINK_REG(0x7C), 0x04, 0x02, //RNMIFSB, RFSBVK
218 0x00, 0xFF, SB_VLINK_REG(0xE0), 0xF0, 0x90, //RCCA_NEWCLK, RCCA_CLKON. Use New dynamic clock scheme
219 0x00, 0xFF, SB_VLINK_REG(0xE7), 0xFF, 0x00, //Let CCA use dynamic clock.
220 //The CCA is also relate to D17F0
221 // 0x00, 0xFF, SB_LPC_REG(0x49), 0x1F, 0x00, //Disable CCA Test Mode
222 0x00, 0xFF, SB_LPC_REG(0x74), 0xFF, 0x00, // Let DMA cycles from internal devices directly go to NB // Reserved in 409 by Eric
223 {0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // End of Table
226 static const struct VIA_PCI_REG_INIT_TABLE IDEC_INIT[] = {
228 // 0x00, 0xFF, SB_IDEC_REG(0x09), 0x00, 0x05, //set to native mode
229 0x00, 0xFF, SB_IDEC_REG(0x04), 0x00, 0x07,
230 //0x00, 0xFF, SB_VLINK_REG(0x7C), 0x00, 0x7F,
231 {0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // End of Table
235 static const struct VIA_PCI_REG_INIT_TABLE mSbApicInitTable[] = {
236 0x00, 0xFF, SB_LPC_REG(0x4D), 0x04, 0x00,
237 0x00, 0xFF, SB_LPC_REG(0x5B), 0x0E, 0x00,
238 0x00, 0xFF, SB_LPC_REG(0x6C), 0x08, 0x00,
239 0x00, 0xFF, SB_LPC_REG(0x58), 0x00, 0x40,
240 0x00, 0xFF, SB_VLINK_REG(0x74), 0x00, 0x04,
241 //0x00, 0xFF, SB_VLINK_REG(0x7C), 0x00, 0x7F,
242 {0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // End of Table
250 device_t_raw rawdevice = 0;
252 rawdevice = PCI_RAWDEV(0, 0x11, 0);
253 // Set the PMIO base io address
254 pci_rawmodify_config16(rawdevice, 0x88, VX800_ACPI_IO_BASE,
257 pci_rawmodify_config16(rawdevice, 0x80, 0x8000, 0x8000);
258 // Enable Soft Resume
259 outw(inw(VX800_ACPI_IO_BASE + 0x04) | 0x8000,
260 VX800_ACPI_IO_BASE + 0x04);
263 sbchiprev = pci_rawread_config8(rawdevice, 0xf6);
264 printk(BIOS_DEBUG, "SB chip revision =%x\n", sbchiprev);
266 // Fill Register Table
267 via_pci_inittable(sbchiprev, mSbStage1InitTbl);
269 // Close all SMI/Io Traps
270 outb(0x00, VX800_ACPI_IO_BASE + 0x42);
275 void Stage2NbInit(void)
277 device_t_raw rawdevice = 0;
280 rawdevice = PCI_RAWDEV(0, 0, 4);
281 nbchiprev = pci_rawread_config8(rawdevice, 0xf6);
282 printk(BIOS_DEBUG, "NB chip revision =%x\n", nbchiprev);
284 via_pci_inittable(nbchiprev, mNbStage2InitTable);
286 rawdevice = PCI_RAWDEV(0, 0, 0);
288 subid = PCI_DEVICE_ID_VIA_VX855_D0F0 << 16 + PCI_VENDOR_ID_VIA;
289 pci_rawwrite_config32(rawdevice, 0x2C, subid);
291 //vx855 NB no pcie bus
296 void IDECSupportOption(u8 sbchiprev)
298 pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x50, 0, 0x08);
300 pci_rawmodify_config8(PCI_RAWDEV(0, 0xf, 0), 0x45, 0x00, 0x80);
301 pci_rawmodify_config8(PCI_RAWDEV(0, 0xf, 0), 0x0A, 0x01, 0xFF);
302 pci_rawmodify_config8(PCI_RAWDEV(0, 0xf, 0), 0x45, 0x80, 0x00);
303 pci_rawmodify_config8(PCI_RAWDEV(0, 0xf, 0), 0x40, 0x02, 0x00);
305 pci_rawmodify_config8(PCI_RAWDEV(0, 0xf, 0), 0x09, 0x00, 0x05); //COMPATIBLE MODE
306 // pci_rawmodify_config8(PCI_RAWDEV(0, 0xf, 0), 0x09, 0x05, 0x05);//native MODE
308 via_pci_inittable(sbchiprev, IDEC_INIT);
311 void InitIDEC(u8 sbchiprev)
313 IDECSupportOption(sbchiprev);
317 void InitUHCI(u8 Number, u8 bEnable)
328 // The BitShift is got from Datasheet.
347 Mask = 0x1 << BitShift;
351 Value = 0x1 << BitShift;
353 pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x50, Value, Mask);
358 pci_rawwrite_config16(PCI_RAWDEV(0, 0x10, BaseAddress),
361 // Config some Control Register
365 pci_rawmodify_config8(PCI_RAWDEV(0, 0x10, BaseAddress),
369 pci_rawmodify_config8(PCI_RAWDEV(0, 0x10, BaseAddress),
375 static const struct VIA_PCI_REG_INIT_TABLE mEHCIInitTable[] = {
377 0x00, 0xFF, SB_EHCI_REG(0x43), 0x00, 0xC0,
378 0x00, 0xFF, SB_EHCI_REG(0x50), 0x00, 0x80,
379 0x00, 0xFF, SB_EHCI_REG(0x48), 0x20, 0x9E,
380 0x00, 0xFF, SB_EHCI_REG(0x49), 0x10, 0x68,
381 0x00, 0xFF, SB_EHCI_REG(0x4B), 0x00, 0x69,
382 0x00, 0xFF, SB_EHCI_REG(0x4D), 0x00, 0x94,
383 0x00, 0xFF, SB_EHCI_REG(0x52), 0x08, 0x00,
384 0x00, 0xFF, SB_EHCI_REG(0x5A), 0x00, 0x8A,
385 0x00, 0xFF, SB_EHCI_REG(0x5B), 0x00, 0x89,
386 0x00, 0xFF, SB_EHCI_REG(0x5C), 0x00, 0x03,
387 0x00, 0xFF, SB_EHCI_REG(0x5D), 0x00, 0x9A,
388 0x00, 0xFF, SB_EHCI_REG(0x5E), 0x00, 0x00,
389 0x00, 0xFF, SB_EHCI_REG(0x6B), 0x00, 0x00,
390 0x00, 0xFF, SB_EHCI_REG(0x6D), 0x00, 0x00,
391 0x00, 0xFF, SB_EHCI_REG(0x6F), 0xF0, 0x00,
392 0x00, 0xFF, SB_EHCI_REG(0x4E), 0x01, 0x01,
393 0x00, 0xFF, SB_EHCI_REG(0x4F), 0x00, 0x11,
394 {0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // End of Table
398 void InitEHCI(u8 Number, u8 bEnable)
410 pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x50, Value, Mask);
414 // Get Chipset Revision
416 pci_rawread_config8(PCI_RAWDEV(0, 0x10, 4), 0xF6);
417 printk(BIOS_DEBUG, "EHCI Revision =%x\n", EHCIRevision);
418 via_pci_inittable(EHCIRevision, mEHCIInitTable);
423 void InitUSBC(u8 sbchiprev)
431 void WriteSbApicIndexedReg(u8 Idx, u32 Data)
434 u32 ApicIdxAdr = VX800SB_APIC_BASE;
435 u32 ApicDataAdr = VX800SB_APIC_BASE + VX800SB_APIC_DATA_OFFSET;
436 *((u8 *) ApicIdxAdr) = Idx;
437 Data32 = (*((u32 *) ApicDataAdr)); //this read is needed when write APIC ID ,dont know why.
439 *((u32 *) ApicDataAdr) = Data32;
442 void SbApicMmioRegInit(void)
445 WriteSbApicIndexedReg(3, 1);
446 WriteSbApicIndexedReg(0, 4);
447 for (Offset = 0x10; Offset < VX800SB_APIC_ENTRY_NUMBER;
449 WriteSbApicIndexedReg(Offset + 1, 0);
450 WriteSbApicIndexedReg(Offset, 0x10000);
454 void SbApicInit(u8 sbchiprev)
456 via_pci_inittable(sbchiprev, mSbApicInitTable);
460 void SbAcpiInit(void)
466 io_rawmodify_config8(VX800_ACPI_IO_BASE + 0x04, Value, Mask);
469 #define HPET_ENABLE_BIT 0x80
470 #define R_SB_HPET_CONTROL 0x68
471 #define HPET_BASE_ADDRESS 0xFED0 // 0xFED00000
472 #define R_SB_HPET_ADDRESS 0x69
476 u8 HpetEnable = HPET_ENABLE_BIT;
477 u16 HpetBase = HPET_BASE_ADDRESS;
478 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), R_SB_HPET_CONTROL,
480 pci_rawwrite_config16(PCI_RAWDEV(0, 0x11, 0),
481 R_SB_HPET_ADDRESS + 1, HpetBase);
484 static const struct VIA_PCI_REG_INIT_TABLE mPMUInitTable[] = {
486 0x00, 0xFF, SB_LPC_REG(0x80), 0x00, 0x20,
487 0x00, 0xFF, SB_LPC_REG(0x8C), 0x02, 0x00,
488 0x00, 0xFF, SB_LPC_REG(0x8D), 0x00, 0x18,
490 //Miscellaneous Configuration 1
491 0x00, 0xFF, SB_LPC_REG(0x94), 0xF0, 0x28,
492 0x00, 0xFF, SB_LPC_REG(0x95), 0x00, 0xC1,
493 0x00, 0xFF, SB_LPC_REG(0x96), 0xFF, 0x10,
494 0x00, 0xFF, SB_LPC_REG(0x97), 0x00, 0xB2,
496 //Voltage Change Function Enable
497 0x00, 0xFF, SB_LPC_REG(0x9F), 0x00, 0x21,
498 //Internal PCIe and NM PLL Control
499 0x00, 0xFF, SB_LPC_REG(0xE2), 0x00, 0xEA,
501 0x00, 0xFF, SB_LPC_REG(0xE7), 0x00, 0x80,
502 {0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // End of Table
505 void InitPMU(u8 sbchiprev)
509 via_pci_inittable(sbchiprev, mPMUInitTable);
512 // Set SCI IRQ and its level trigger
515 pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x82, Value, Mask);
519 io_rawmodify_config8(0x4d1, Value, Mask);
522 #define R_SB_MULTI_FUNCTION_SELECT_1 0xE4
523 #define R_SB_CX_STATE_BREAK_EVENT_ENABLE_1 0xE6
524 #define PMIO_PROCESSOR_CONTROL 0x26
525 #define R_SB_PCI_ARBITRATION_2 0x76
526 #define R_SB_AUTO_SWITCH_P_STATE 0x8A
528 void InitCPUCStatueSupport()
533 // Now it is C2 & C4 Up Down Mode
536 pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), R_SB_CX_STATE_BREAK_EVENT_ENABLE_1, Value, Mask); //SB_LPC_REG
540 io_rawmodify_config8(VX800_ACPI_IO_BASE + PMIO_PROCESSOR_CONTROL,
545 pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 7), R_SB_PCI_ARBITRATION_2, Value, Mask); //SB_VLINK_REG
549 pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), R_SB_MULTI_FUNCTION_SELECT_1, Value, Mask); //SB_VLINK_REG
553 pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), R_SB_AUTO_SWITCH_P_STATE, Value, Mask); //SB_VLINK_REG
556 void InitSBPM(u8 sbchiprev)
560 InitCPUCStatueSupport();
563 void Stage2SbInit(void)
565 device_t_raw rawdevice = 0;
568 rawdevice = PCI_RAWDEV(0, 11, 0);
569 sbchiprev = pci_rawread_config8(rawdevice, 0xf6);
570 printk(BIOS_DEBUG, "SB chip revision =%x\n", sbchiprev);
573 via_pci_inittable(sbchiprev, mBusControllerInitTable);
574 via_pci_inittable(sbchiprev, mPCI1InitTable);
575 via_pci_inittable(sbchiprev, mCCAInitTable);
584 SbApicInit(sbchiprev);
588 //pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x50, 0x76, 0);//SB_VLINK_REG
593 void init_VIA_chipset(void)
595 printk(BIOS_DEBUG, "In: init_VIA_chipset\n");
596 //1.nbstage1 is done in raminit.
606 pci_rawmodify_config32(PCI_RAWDEV(0, 0x11, 7), 0xd1, 0, 0x04);
607 printk(BIOS_DEBUG, "End: init_VIA_chipset\n");
611 * @brief Main function of the DRAM part of coreboot.
613 * Coreboot is divided into Pre-DRAM part and DRAM part.
616 * Device Enumeration:
617 * In the dev_enumerate() phase,
620 void hardwaremain(int boot_complete)
622 struct lb_memory *lb_mem;
623 #if CONFIG_HAVE_ACPI_RESUME == 1
628 tmp = inw(VX800_ACPI_IO_BASE + 0x04);
629 acpi_sleep_type = ((tmp & (7 << 10)) >> 10) == 1 ? 3 : 0;
633 printk(BIOS_EMERG, "file '%s', line %d\n\n", __FILE__, __LINE__);
637 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 4), 0xa3, 0x80);
638 pci_rawwrite_config8(PCI_RAWDEV(0, 17, 7), 0x60, 0x20);
639 pci_rawwrite_config8(PCI_RAWDEV(0, 17, 7), 0xE5,
640 pci_rawread_config8(PCI_RAWDEV(0, 3, 0),
644 pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x51, 0x40, 0x40); //close CE-ATA (Consumer Electronics-ATA) and NFC
646 //pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x50, 0x0, 0x40);//open USB Device Mode Enable
647 pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x50, 0x40, 0x40); //close USB Device Mode
649 //pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x50, 0x04, 0x04);//close USB 1.1 UHCI Port 4-5
650 //pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x50, 0x02, 0x02);//close USB 2.0 ehci
653 //pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x50, 0x00, 0x76);//open all usb and usb mode
654 //pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x50, 0x76, 0x76);//close all usb
656 printk(BIOS_INFO, "=================SB 50h=%02x \n",
657 pci_rawread_config8(PCI_RAWDEV(0, 0x11, 0), 0x50));
660 /* FIXME: Is there a better way to handle this? */
662 printk(BIOS_EMERG, "file '%s', line %d\n\n", __FILE__, __LINE__);
664 /* Find the devices we don't have hard coded knowledge about. */
666 printk(BIOS_EMERG, "file '%s', line %d\n\n", __FILE__, __LINE__);
669 printk(BIOS_INFO, "dump ehci3 \n");
670 for (; x < 16; x++) {
672 for (; y < 16; y++) {
673 printk(BIOS_INFO, "%02x ",
674 pci_rawread_config8(PCI_RAWDEV
678 printk(BIOS_INFO, "\n");
683 /* Now compute and assign the bus resources. */
685 printk(BIOS_EMERG, "file '%s', line %d\n\n", __FILE__, __LINE__);
688 printk(BIOS_INFO, "dump ehci3 \n");
689 for (; x < 16; x++) {
691 for (; y < 16; y++) {
692 printk(BIOS_INFO, "%02x ",
693 pci_rawread_config8(PCI_RAWDEV
697 printk(BIOS_INFO, "\n");
702 /* Now actually enable devices on the bus */
704 printk(BIOS_EMERG, "file '%s', line %d\n\n", __FILE__, __LINE__);
705 /* And of course initialize devices on the bus */
708 printk(BIOS_INFO, "dump ehci3 \n");
709 for (; x < 16; x++) {
711 for (; y < 16; y++) {
712 printk(BIOS_INFO, "%02x ",
713 pci_rawread_config8(PCI_RAWDEV
717 printk(BIOS_INFO, "\n");
723 printk(BIOS_EMERG, "file '%s', line %d\n\n", __FILE__, __LINE__);
726 // pci_rawwrite_config16(PCI_RAWDEV(0, 0xf, 0), 0xBA, 0x0571);
730 printk(BIOS_INFO, "dump ehci3 \n");
731 for (; x < 16; x++) {
733 for (; y < 16; y++) {
734 printk(BIOS_INFO, "%02x ",
735 pci_rawread_config8(PCI_RAWDEV
739 printk(BIOS_INFO, "\n");
746 y = pci_rawread_config8(PCI_RAWDEV(0, 0xf, 0), 0x0d);
749 pci_rawwrite_config8(PCI_RAWDEV(0, 0xf, 0), 0x0d, y);
755 static const d0f0pcitable[5] = { 0xD0, 0, 0, 0, 0xFD };
756 static const d0f2pcitable[16 * 7 + 1] = {
757 0x88, 0xF8, 0xEF, 0x44, 0x7C, 0x24, 0x63, 0x01, 0x00, 0x09,
758 0x00, 0x00, 0x10, 0xA2, 0x88, 0xCE,
759 0xFF, 0x0F, 0x00, 0xAA, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00,
760 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
761 0xCC, 0x66, 0xAA, 0x55, 0x30, 0x38, 0x0C, 0x00, 0x00, 0x00,
762 0x00, 0x22, 0x00, 0xAA, 0x00, 0x00,
763 0x44, 0x44, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
764 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
765 0x0B, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x01, 0x41, 0x06,
766 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
767 0x00, 0x88, 0x56, 0x70, 0x77, 0x77, 0x07, 0x77, 0x77, 0x04,
768 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
769 0x77, 0x77, 0x33, 0x33, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
770 0x77, 0x77, 0x44, 0x44, 0x14, 0x00,
774 static const d0f4pcitable[16 * 6 + 3] = {
776 0xFF, 0xFF, 0xCC, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
778 0x80, 0xE0, 0xD6, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
779 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
780 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
781 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
783 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
784 0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x00, 0x00, 0x04, 0x04,
785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
786 0x00, 0x00, 0x00, 0x00, 0x12, 0x12, 0x00, 0x00, 0x08, 0xF4,
787 0x01, 0x01, 0x79, 0x79, 0x0A, 0x00,
789 static const d0f5pcitable[16 * 10] = {
790 0x13, 0x0E, 0x00, 0x00, 0xD2, 0x00, 0x00, 0x00, 0x00, 0x00,
791 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
792 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
793 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
794 0x18, 0x9A, 0x00, 0x81, 0x28, 0xC0, 0x00, 0x00, 0x00, 0x00,
795 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
797 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
798 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
799 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
800 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
801 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
802 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
803 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
804 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
805 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
807 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
808 0x26, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
809 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
812 static const d0f7pcitable[16 * 9] = {
813 0x00, 0x2A, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
814 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
815 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
816 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
818 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
819 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
821 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
822 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
823 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
824 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
825 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
826 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
827 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
828 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
829 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x29, 0x00, 0x00, 0x00,
830 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
832 static const d1f0pcitable[3] = {
836 static const dcf0pcitable[96] = {
837 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
840 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
843 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
845 0x01, 0x00, 0xC2, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
846 0x40, 0x01, 0x03, 0x01, 0x7E, 0x01,
847 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9,
848 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
851 static const d10f4pcitable[48] = {
852 0x00, 0x20, 0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x68,
853 0x00, 0x09, 0x13, 0x94, 0x03, 0x10,
854 0x80, 0x60, 0x11, 0xBF, 0x00, 0xFF, 0x0F, 0x00, 0x04, 0x0B,
855 0xCC, 0xCC, 0x00, 0xCC, 0x00, 0x00,
856 0x20, 0x20, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00,
857 0x00, 0x00, 0x00, 0x20, 0x00, 0xC0,
860 static const d11f0pcitable[16 * 12] = {
861 0x44, 0x40, 0xF0, 0x0B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x20,
862 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
863 0xC1, 0x4D, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
864 0x00, 0x51, 0x00, 0x00, 0x00, 0x00,
865 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00,
866 0xD0, 0xFE, 0x00, 0x00, 0x00, 0x00,
867 0x06, 0x11, 0x09, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
868 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
869 0x20, 0x84, 0x49, 0x00, 0x88, 0x00, 0x00, 0x00, 0x01, 0x08,
870 0x1F, 0x00, 0x07, 0x1A, 0x00, 0x00,
871 0x00, 0x6E, 0xBC, 0x88, 0x28, 0xC1, 0x10, 0x80, 0x00, 0x80,
872 0x20, 0x88, 0x00, 0x00, 0x00, 0xAD,
873 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
874 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
875 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
876 0x00, 0x00, 0x10, 0xD0, 0xFE, 0x90,
877 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
879 0x01, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
880 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881 0x00, 0x00, 0xE7, 0x03, 0xA0, 0x60, 0x20, 0xC0, 0x00, 0x00,
882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
884 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
887 static const d11f7pcitable[192] = {
888 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
889 0x00, 0x00, 0x00, 0x00, 0x80, 0x43,
890 0x08, 0x80, 0x11, 0x11, 0x02, 0x0F, 0x00, 0x00, 0x00, 0x00,
891 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
892 0x80, 0x00, 0x00, 0x20, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
893 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
894 0x82, 0xC8, 0xEE, 0x01, 0x0C, 0x0F, 0xD0, 0x48, 0x00, 0x00,
895 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
896 0x07, 0x00, 0x21, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
897 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
898 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
899 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
900 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
901 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
902 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
903 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
904 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
905 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
906 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
907 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
908 0x93, 0x08, 0x00, 0x5E, 0x00, 0x80, 0x29, 0x00, 0x00, 0x00,
909 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
911 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
918 static const OPTION_1_d11f0pcitable[16 * 12] = {
919 0x44, 0x80, 0xf0, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x20,
920 0x00, 0x00, 0x04, 0x01, 0x08, 0x00,
921 0xc0, 0x4d, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
922 0x00, 0x53, 0x00, 0xfe, 0x00, 0x00,
923 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x80, 0x00,
924 0xd0, 0xfe, 0x00, 0x00, 0xdf, 0x00,
925 0x06, 0x11, 0x53, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
926 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
927 0x20, 0x84, 0x4a, 0x00, 0xda, 0x40, 0x00, 0x00, 0x01, 0x40,
928 0x1f, 0x00, 0x07, 0x18, 0x00, 0x00,
929 0x00, 0x2e, 0xbc, 0x00, 0x28, 0xc1, 0x10, 0x80, 0x00, 0x80,
930 0x08, 0x88, 0x00, 0x00, 0x00, 0xad,
931 0x06, 0x11, 0x53, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
932 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
933 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x40,
934 0x00, 0x00, 0x00, 0xd3, 0xfe, 0x53,
935 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
936 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
937 0x01, 0x41, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
938 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
939 0x00, 0x00, 0xeb, 0x03, 0xa0, 0x60, 0x20, 0x80, 0x00, 0x00,
940 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
941 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
942 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
949 /* error form ---- but add the chance to resume
951 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 0), i, d0f0pcitable[i+0xcb]);
959 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 0), i+0xcb, d0f0pcitable[i]);
964 //boot ok, resume still err in linux
966 for (i = 0; i < 9; i++) {
967 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 2), i + 0x50,
970 //9 is warm reset reg, // boot err in coreboot
971 for (i = 10; i < 64; i++) {
972 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 2), i + 0x50,
975 //0x90 look d0f2 appendixA1 , if set this to 09 or 0b, then some ddr2 will crash.
976 for (i = 65; i < 113; i++) {
977 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 2), i + 0x50,
982 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 2), 0x66, 0x09);
983 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 2), 0x70, 0xdd);
984 // pci_rawwrite_config8(PCI_RAWDEV(0, 0, 2), 0x90, 0x09);
985 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 2), 0x92, 0x40);
996 // pci_rawwrite_config8(PCI_RAWDEV(0, 0, 3), 0x86, 0x3b); setting, my lspci is 0x29
997 //set bit4 cause the ide not be found
998 // pci_rawwrite_config8(PCI_RAWDEV(0, 0, 3), 0x86, 0x2b);
999 //set bit1 cause the ide not be found
1001 // pci_rawwrite_config8(PCI_RAWDEV(0, 0, 3), 0x86, 0x29);
1002 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 3), 0x95, 0x05);
1003 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 3), 0x99, 0x12);
1005 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 3), 0xde, 0x00);
1008 //boot ok, resume err in coreboot
1010 for (i = 0; i < 99; i++) {
1011 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 4), i + 0x8d,
1017 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 4), 0xe9, 0x90);
1018 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 4), 0xec, 0x0);
1019 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 4), 0xed, 0x0);
1020 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 4), 0xee, 0x0);
1025 //boot ok, resume still err in linux
1026 for (i = 0; i < 160; i++) {
1027 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 5), i + 0x60,
1030 for (i = 0; i < 144; i++) {
1031 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 7), i + 0x60,
1034 for (i = 0; i < 3; i++) {
1035 pci_rawwrite_config8(PCI_RAWDEV(0, 1, 0), i + 0xb0,
1038 for (i = 0; i < 96; i++) {
1039 pci_rawwrite_config8(PCI_RAWDEV(0, 0xc, 0), i + 0x40,
1045 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 7), 0x61, 0x0);
1046 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 7), 0x63, 0x0);
1047 pci_rawwrite_config8(PCI_RAWDEV(0, 0, 7), 0x76, 0xd0);
1048 pci_rawwrite_config8(PCI_RAWDEV(0, 0xc, 0), 0x88, 0x81);
1049 pci_rawwrite_config8(PCI_RAWDEV(0, 0xc, 0), 0x89, 0x01);
1050 pci_rawwrite_config8(PCI_RAWDEV(0, 0xc, 0), 0x8A, 0x60);
1060 pci_rawwrite_config8(PCI_RAWDEV(0, 0x10, 0), 0x4a, 0xa2); // no affect.
1061 pci_rawwrite_config8(PCI_RAWDEV(0, 0x10, 1), 0x4a, 0xa2);
1062 pci_rawwrite_config8(PCI_RAWDEV(0, 0x10, 2), 0x4a, 0xa2);
1064 //boot ok, resume still err in linux, and if disable USB, then all ok
1065 // for(i=0;i<48;i++){
1066 for (i = 0; i < 44; i++) {
1067 pci_rawwrite_config8(PCI_RAWDEV(0, 0x10, 4), i + 0x40,
1074 pci_rawwrite_config8(PCI_RAWDEV(0, 0x10, 4), 0x6b, 0x01);
1075 pci_rawwrite_config8(PCI_RAWDEV(0, 0x10, 4), 0x6d, 0x00);
1076 pci_rawwrite_config8(PCI_RAWDEV(0, 0x10, 4), 0x6e, 0x08);
1077 pci_rawwrite_config8(PCI_RAWDEV(0, 0x10, 4), 0x6f, 0x80);
1083 //before (11.0)is add, s3 resume has already always dead in first resume(more frequenly), and sleep ok
1084 // for(i=0;i<192;i++){
1085 for (i = 0; i < 6; i++) {
1086 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1089 //6 is uart and dvp vcp, will have // HAVE no com1 ,and no gui show,textmode ok ,s3 sleep ok, resume fail
1091 //7-18 is my familar part
1092 for (i = 7; i < 18; i++) { //sleep ok ,resume sleep err 2
1093 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1098 for (i = 18; i < 21; i++) { //sleep ok , sleep err 1, resume
1099 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1102 //0x55 56 57 irq intA#B#C# linkA#linkB#linkC#
1103 for (i = 24; i < 27; i++) { //sleep ok , resume sleep err 1 resume 1
1104 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1108 pci_rawmodify_config8(PCI_RAWDEV(0, 0x11, 0), 0x5b, 0x0, 0x08);
1110 // pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i+0x40, d11f0pcitable[i]);
1112 for (i = 28; i < 72; i++) { //sleep ok , resume sleep err 1 , resume 1ci
1113 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1118 for (i = 74; i < 112; i++) { //boot ok, resume still err in linux
1119 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1123 //B0B4B5 dvp vcp, if copy this ,then no uart, no gui(of unbuntu)
1124 // pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), 0xb0, d11f0pcitable[112]);
1125 i = pci_rawread_config8(PCI_RAWDEV(0, 17, 0), 0xB0);
1126 //multiplex with VCP
1129 pci_rawwrite_config8(PCI_RAWDEV(0, 17, 0), 0xB0, i);
1133 for (i = 113; i < 114; i++) { //boot ok, resume still err in linux
1134 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1138 for (i = 115; i < 116; i++) { //boot ok, resume still err in linux
1139 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1144 for (i = 118; i < 192; i++) { //boot ok, resume still err in linux
1145 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1150 // for(i=0;i<192;i++){
1151 for (i = 0; i < 6; i++) {
1152 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1153 OPTION_1_d11f0pcitable[i]);
1155 //6 is uart and dvp vcp, will have // HAVE no com1 ,and no gui show,textmode ok ,s3 sleep ok, resume fail
1157 //7-18 is my familar part
1158 for (i = 7; i < 18; i++) { // sleep err 2
1159 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1160 OPTION_1_d11f0pcitable[i]);
1163 for (i = 18; i < 21; i++) { //sleep ok , resume ???
1164 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1167 //0x55 56 57 irq intA#B#C# linkA#linkB#linkC#
1168 for (i = 24; i < 27; i++) { //sleep ok , resume ???
1169 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1174 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1175 OPTION_1_d11f0pcitable[i]);
1177 for (i = 28; i < 72; i++) { //sleep ok , resume???
1178 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1179 OPTION_1_d11f0pcitable[i]);
1183 for (i = 74; i < 112; i++) { //boot ok, resume still err in linux
1184 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1185 OPTION_1_d11f0pcitable[i]);
1188 //B0B4B5 dvp vcp, if copy this ,then no uart, no gui(of unbuntu)
1189 // pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), 0xb0, OPTION_1_d11f0pcitable[112]);
1190 i = pci_rawread_config8(PCI_RAWDEV(0, 17, 0), 0xB0);
1191 //multiplex with VCP
1194 pci_rawwrite_config8(PCI_RAWDEV(0, 17, 0), 0xB0, i);
1198 for (i = 113; i < 114; i++) { //boot ok, resume still err in linux
1199 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1200 OPTION_1_d11f0pcitable[i]);
1203 for (i = 115; i < 116; i++) { //boot ok, resume still err in linux
1204 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1205 OPTION_1_d11f0pcitable[i]);
1208 for (i = 118; i < 192; i++) { //boot ok, resume still err in linux
1209 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), i + 0x40,
1210 OPTION_1_d11f0pcitable[i]);
1215 pci_rawwrite_config16(PCI_RAWDEV(0, 0xf, 0), 0xBA, PCI_DEVICE_ID_VIA_VX855_IDE); //5324
1216 pci_rawwrite_config16(PCI_RAWDEV(0, 0xf, 0), 0xBE,
1217 PCI_DEVICE_ID_VIA_VX855_IDE);
1218 pci_rawwrite_config16(PCI_RAWDEV(0, 0x11, 0), 0xA0,
1220 pci_rawwrite_config16(PCI_RAWDEV(0, 0x11, 0), 0xA2, PCI_DEVICE_ID_VIA_VX855_LPC); //8353
1221 i = pci_rawread_config8(PCI_RAWDEV(0, 0x11, 0), 0x79);
1224 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 0), 0x79, i);
1225 pci_rawwrite_config16(PCI_RAWDEV(0, 0x11, 0), 0x72,
1226 PCI_DEVICE_ID_VIA_VX855_LPC);
1229 //boot ok, resume still err in linux
1230 for (i = 0; i < 192; i++) {
1231 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 7), i + 0x40,
1236 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 7), 0x61, 0x2a);
1237 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 7), 0x63, 0xa0);
1238 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 7), 0x64, 0xaa);
1239 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 7), 0x84, 0x0);
1240 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 7), 0x88, 0x02);
1241 pci_rawwrite_config8(PCI_RAWDEV(0, 0x11, 7), 0xe6, 0x3f);
1244 pci_rawwrite_config8(PCI_RAWDEV(0, 0x14, 0), 0x40, 0x20);
1245 pci_rawwrite_config8(PCI_RAWDEV(0, 0x14, 0), 0x41, 0x31);
1250 pci_rawwrite_config8(PCI_RAWDEV(0, 0x14, 0), 0x40, 0x00);
1258 //set VGA memory selection
1259 i911 = pci_rawread_config8(PCI_RAWDEV(0, 0x1, 0), 0xb0);
1263 pci_rawwrite_config8(PCI_RAWDEV(0, 0x1, 0), 0xb0, i911);
1268 printk(BIOS_INFO, "=========zjldump all devices...\n");
1269 for (dev = all_devices; dev; dev = dev->next) {
1270 if (dev->path.type == DEVICE_PATH_PCI) {
1271 printk(BIOS_DEBUG, "%s dump\n", dev_path(dev));
1273 for (; x < 16; x++) {
1275 for (; y < 16; y++) {
1276 printk(BIOS_INFO, "%02x ",
1277 pci_read_config8(dev,
1282 printk(BIOS_INFO, "\n");
1286 printk(BIOS_INFO, "\n");
1293 //pci_rawmodify_config8(PCI_RAWDEV(0, 0x10, 4), 0x04, 0x17, 0x17);//
1294 // pci_rawmodify_config8(PCI_RAWDEV(0, 0x10, 4), 0x0c, 0x08, 0xff);///