2 * This file is part of the coreboot project.
4 * Copyright (C) 2008 Advanced Micro Devices, 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
22 #include <device/pci.h>
25 #include <device/pci.h>
26 #include <statictree.h>
30 #define SMBUS_IO_BASE 0x1000 /* Is it a temporary SMBus I/O base address? */
33 /* Get SB ASIC Revision.*/
34 static u8 get_sb600_revision()
37 pci_conf1_find_device(0x1002, 0x4385, &dev);
39 if (dev == PCI_DEV_INVALID) {
40 die("SMBUS controller not found\r\n");
42 return pci_conf1_read_config8(dev, 0x08);
46 /***************************************
47 * Legacy devices are mapped to LPC space.
50 * ACPI Micro-controller port
52 * NOTE: Call me ASAP, because I will reset LPC ROM size!
53 ***************************************/
54 static void sb600_lpc_init(void)
60 /* Enable lpc controller */
61 pci_conf1_find_device(0x1002, 0x4385, &dev); /* SMBUS controller */
62 reg32 = pci_conf1_read_config32(dev, 0x64);
64 pci_conf1_write_config32(dev, 0x64, reg32);
66 pci_conf1_find_device(0x1002, 0x438d, &dev); /* LPC Controller */
68 reg8 = pci_conf1_read_config8(dev, 0x44);
70 pci_conf1_write_config8(dev, 0x44, reg8);
72 /* PS/2 keyboard, ACPI */
73 reg8 = pci_conf1_read_config8(dev, 0x47);
74 reg8 |= (1 << 5) | (1 << 6);
75 pci_conf1_write_config8(dev, 0x47, reg8);
77 /* SuperIO, LPC ROM */
78 reg8 = pci_conf1_read_config8(dev, 0x48);
79 reg8 |= (1 << 1) | (1 << 0); /* enable Super IO config port 2e-2h, 4e-4f */
80 reg8 |= (1 << 3) | (1 << 4); /* enable for LPC ROM address range1&2, Enable 512KB rom access at 0xFFF80000 - 0xFFFFFFFF */
81 reg8 |= 1 << 6; /* enable for RTC I/O range */
82 pci_conf1_write_config8(dev, 0x48, reg8);
84 /* hardware should enable LPC ROM by pin strapes */
85 /* rom access at 0xFFF80000/0xFFF00000 - 0xFFFFFFFF */
86 /* See detail in BDG-215SB600-03.pdf page 15. */
87 pci_conf1_write_config16(dev, 0x68, 0x000e); /* enable LPC ROM range, 0xfff8: 512KB, 0xfff0: 1MB; */
88 pci_conf1_write_config16(dev, 0x6c, 0xfff0); /* enable LPC ROM range, 0xfff8: 512KB, 0xfff0: 1MB */
91 /* what is its usage? */
92 static u32 get_sbdn(u32 bus)
96 /* Find the device. */
97 pci_conf1_find_on_bus(bus, 0x1002, 0x4385, &dev);
98 return (dev >> 15) & 0x1f;
102 static u8 dual_core()
104 if(((cpuid_eax(0x80000000) & ~0xff) >= 8)) {
105 if(cpuid_ecx(0x80000008) & 1)
112 SB600 VFSMAF (VID/FID System Management Action Field) is 010b by default.
113 RPR 2.3.3 C-state and VID/FID change for the K8 platform.
115 static void enable_fid_change_on_sb(u32 sbbusn, u32 sbdn)
118 byte = pmio_read(0x9a);
124 pmio_write(0x9a, byte);
126 byte = pmio_read(0x8f);
129 pmio_write(0x8f, byte);
131 pmio_write(0x8b, 0x01);
132 pmio_write(0x8a, 0x90);
134 if(get_sb600_revision() > 0x13)
135 pmio_write(0x88, 0x10);
137 pmio_write(0x88, 0x06);
139 byte = pmio_read(0x7c);
142 pmio_write(0x7c, byte);
144 /*Must be 0 for K8 platform.*/
145 byte = pmio_read(0x68);
147 pmio_write(0x68, byte);
148 /*Must be 0 for K8 platform.*/
149 byte = pmio_read(0x8d);
151 pmio_write(0x8d, byte);
153 byte = pmio_read(0x61);
155 pmio_write(0x61, byte);
157 byte = pmio_read(0x42);
159 pmio_write(0x42, byte);
161 if(get_sb600_revision() == 0x14) {
162 pmio_write(0x89, 0x10);
164 byte = pmio_read(0x52);
166 pmio_write(0x52, byte);
171 static void hard_reset(void)
180 static void soft_reset(void)
188 static void sb600_pci_port80()
194 pci_conf1_find_device(0x1002, 0x4384, &dev);
196 byte = pci_conf1_read_config8(dev, 0x40);
198 pci_conf1_write_config8(dev, 0x40, byte);
200 byte = pci_conf1_read_config8(dev, 0x4B);
202 pci_conf1_write_config8(dev, 0x4B, byte);
204 byte = pci_conf1_read_config8(dev, 0x1C);
206 pci_conf1_write_config8(dev, 0x1C, byte);
208 byte = pci_conf1_read_config8(dev, 0x1D);
210 pci_conf1_write_config8(dev, 0x1D, byte);
212 byte = pci_conf1_read_config8(dev, 0x04);
214 pci_conf1_write_config8(dev, 0x04, byte);
216 pci_conf1_find_device(0x1002, 0x438D, &dev);
218 byte = pci_conf1_read_config8(dev, 0x4A);
219 byte &= ~(1 << 5); /* disable lpc port 80 */
220 pci_conf1_write_config8(dev, 0x4A, byte);
223 static void sb600_lpc_port80(void)
229 /* enable lpc controller */
230 pci_conf1_find_device(0x1002, 0x4385, &dev);
231 reg32 = pci_conf1_read_config32(dev, 0x64);
232 reg32 |= 0x00100000; /* lpcEnable */
233 pci_conf1_write_config32(dev, 0x64, reg32);
235 /* enable prot80 LPC decode in pci function 3 configuration space. */
236 pci_conf1_find_device(0x1002, 0x438d, &dev);
237 byte = pci_conf1_read_config8(dev, 0x4a);
238 byte |= 1 << 5; /* enable port 80 */
239 pci_conf1_write_config8(dev, 0x4a, byte);
243 /* sbDevicesPorInitTable */
244 static void sb600_devices_por_init()
249 printk(BIOS_INFO, "sb600_devices_por_init()\n");
250 /* SMBus Device, BDF:0-20-0 */
251 printk(BIOS_INFO, "sb600_devices_por_init(): SMBus Device, BDF:0-20-0\n");
252 pci_conf1_find_device(0x1002, 0x4385, &dev);
254 if (dev == PCI_DEV_INVALID) {
255 die("SMBUS controller not found\r\n");
257 printk(BIOS_INFO, "SMBus controller enabled, sb revision is 0x%x\r\n",
258 get_sb600_revision());
260 /* sbPorAtStartOfTblCfg */
261 /* Set A-Link bridge access address. This address is set at device 14h, function 0, register 0xf0.
262 * This is an I/O address. The I/O address must be on 16-byte boundry. */
263 pci_conf1_write_config32(dev, 0xf0, AB_INDX);
265 /* To enable AB/BIF DMA access, a specific register inside the BIF register space needs to be configured first. */
266 /*Enables the SB600 to send transactions upstream over A-Link Express interface. */
267 axcfg_reg(0x04, 1 << 2, 1 << 2);
268 axindxc_reg(0x21, 0xff, 0);
270 /* 2.3.5:Enabling Non-Posted Memory Write for the K8 Platform */
271 axindxc_reg(0x10, 1 << 9, 1 << 9);
272 /* END of sbPorAtStartOfTblCfg */
274 /* sbDevicesPorInitTables */
275 /* set smbus iobase */
276 pci_conf1_write_config32(dev, 0x10, SMBUS_IO_BASE | 1);
278 /* enable smbus controller interface */
279 byte = pci_conf1_read_config8(dev, 0xd2);
281 pci_conf1_write_config8(dev, 0xd2, byte);
283 /* set smbus 1, ASF 2.0 (Alert Standard Format), iobase */
284 pci_conf1_write_config16(dev, 0x58, SMBUS_IO_BASE | 0x11);
286 /* TODO: I don't know the useage of followed two lines. I copied them from CIM. */
287 pci_conf1_write_config8(dev, 0x0a, 0x1);
288 pci_conf1_write_config8(dev, 0x0b, 0x6);
291 pci_conf1_write_config8(dev, 0x40, 0xd4);
293 /* Enable ISA Address 0-960K decoding */
294 pci_conf1_write_config8(dev, 0x48, 0x0f);
296 /* Enable ISA Address 0xC0000-0xDFFFF decode */
297 pci_conf1_write_config8(dev, 0x49, 0xff);
299 /* Enable decode cycles to IO C50, C51, C52 GPM controls. */
300 byte = pci_conf1_read_config8(dev, 0x41);
303 pci_conf1_write_config8(dev, 0x41, byte);
305 /* Legacy DMA Prefetch Enhancement, CIM masked it. */
306 /* pci_conf1_write_config8(dev, 0x43, 0x1); */
308 /* Disabling Legacy USB Fast SMI# */
309 byte = pci_conf1_read_config8(dev, 0x62);
311 pci_conf1_write_config8(dev, 0x62, byte);
313 /* Features Enable */
314 pci_conf1_write_config32(dev, 0x64, 0x829E79BF);
316 /* SerialIrq Control */
317 pci_conf1_write_config8(dev, 0x69, 0x90);
319 /* Test Mode, PCIB_SReset_En Mask is set. */
320 pci_conf1_write_config8(dev, 0x6c, 0x20);
322 /* IO Address Enable, CIM set 0x78 only and masked 0x79. */
323 /*pci_conf1_write_config8(dev, 0x79, 0x4F); */
324 pci_conf1_write_config8(dev, 0x78, 0xFF);
326 /* This register is not used on sb600. It came from older chipset. */
327 /*pci_conf1_write_config8(dev, 0x95, 0xFF); */
329 /* Set smbus iospace enable, I don't know why write 0x04 into reg5 that is reserved */
330 pci_conf1_write_config16(dev, 0x4, 0x0407);
332 /* clear any lingering errors, so the transaction will run */
333 outb(inb(SMBUS_IO_BASE + SMBHSTSTAT), SMBUS_IO_BASE + SMBHSTSTAT);
335 /* IDE Device, BDF:0-20-1 */
336 printk(BIOS_INFO, "sb600_devices_por_init(): IDE Device, BDF:0-20-1\n");
337 pci_conf1_find_device(0x1002, 0x438C, &dev);
338 /* Disable prefetch */
339 byte = pci_conf1_read_config8(dev, 0x63);
341 pci_conf1_write_config8(dev, 0x63, byte);
343 /* LPC Device, BDF:0-20-3 */
344 printk(BIOS_INFO, "sb600_devices_por_init(): LPC Device, BDF:0-20-3\n");
345 pci_conf1_find_device(0x1002, 0x438D, &dev);
347 pci_conf1_write_config8(dev, 0x40, 0x04);
349 /* IO Port Decode Enable */
350 pci_conf1_write_config8(dev, 0x44, 0xFF);
351 pci_conf1_write_config8(dev, 0x45, 0xFF);
352 pci_conf1_write_config8(dev, 0x46, 0xC3);
353 pci_conf1_write_config8(dev, 0x47, 0xFF);
355 /* IO/Mem Port Decode Enable, I don't know why CIM disable some ports.
356 * Disable LPC TimeOut counter, enable SuperIO Configuration Port (2e/2f),
357 * Alternate SuperIO Configuration Port (4e/4f), Wide Generic IO Port (64/65).
358 * Enable bits for LPC ROM memory address range 1&2 for 1M ROM setting.*/
359 byte = pci_conf1_read_config8(dev, 0x48);
360 byte |= (1 << 1) | (1 << 0); /* enable Super IO config port 2e-2h, 4e-4f */
361 byte |= (1 << 3) | (1 << 4); /* enable for LPC ROM address range1&2, Enable 512KB rom access at 0xFFF80000 - 0xFFFFFFFF */
362 byte |= 1 << 6; /* enable for RTC I/O range */
363 pci_conf1_write_config8(dev, 0x48, byte);
364 pci_conf1_write_config8(dev, 0x49, 0xFF);
365 /* Enable 0x480-0x4bf, 0x4700-0x470B */
366 byte = pci_conf1_read_config8(dev, 0x4A);
367 byte |= ((1 << 1) + (1 << 6)); /*0x42, save the configuraion for port 0x80. */
368 pci_conf1_write_config8(dev, 0x4A, byte);
370 /* Set LPC ROM size, it has been done in sb600_lpc_init().
371 * enable LPC ROM range, 0xfff8: 512KB, 0xfff0: 1MB;
372 * enable LPC ROM range, 0xfff8: 512KB, 0xfff0: 1MB
373 * pci_conf1_write_config16(dev, 0x68, 0x000e)
374 * pci_conf1_write_config16(dev, 0x6c, 0xfff0);*/
376 /* Enable Tpm12_en and Tpm_legacy. I don't know what is its usage and copied from CIM. */
377 pci_conf1_write_config8(dev, 0x7C, 0x05);
379 /* P2P Bridge, BDF:0-20-4, the configuration of the registers in this dev are copied from CIM,
380 * TODO: I don't know what are their mean? */
381 printk(BIOS_INFO, "sb600_devices_por_init(): P2P Bridge, BDF:0-20-4\n");
382 pci_conf1_find_device(0x1002, 0x4384, &dev);
383 /* I don't know why CIM tried to write into a read-only reg! */
384 /*pci_conf1_write_config8(dev, 0x0c, 0x20) */ ;
386 /* Arbiter enable. */
387 pci_conf1_write_config8(dev, 0x43, 0xff);
389 /* Set PCDMA request into hight priority list. */
390 /* pci_conf1_write_config8(dev, 0x49, 0x1) */ ;
392 pci_conf1_write_config8(dev, 0x40, 0x26);
394 /* I don't know why CIM set reg0x1c as 0x11.
395 * System will block at sdram_initialize() if I set it before call sdram_initialize().
396 * If it is necessary to set reg0x1c as 0x11, please call this function after sdram_initialize().
397 * pci_conf1_write_config8(dev, 0x1c, 0x11);
398 * pci_conf1_write_config8(dev, 0x1d, 0x11);*/
400 /*CIM set this register; but I didn't find its description in RPR.
401 On DBM690T platform, I didn't find different between set and skip this register.
402 But on Filbert platform, the DEBUG message from serial port on Peanut board can't be displayed
403 after the bit0 of this register is set.
404 pci_conf1_write_config8(dev, 0x04, 0x21);
406 pci_conf1_write_config8(dev, 0x0d, 0x40);
407 pci_conf1_write_config8(dev, 0x1b, 0x40);
408 /* Enable PCIB_DUAL_EN_UP will fix potential problem with PCI cards. */
409 pci_conf1_write_config8(dev, 0x50, 0x01);
411 /* SATA Device, BDF:0-18-0, Non-Raid-5 SATA controller */
412 printk(BIOS_INFO, "sb600_devices_por_init(): SATA Device, BDF:0-18-0\n");
413 pci_conf1_find_device(0x1002, 0x4380, &dev);
415 /*PHY Global Control, we are using A14.
416 * default: 0x2c40 for ASIC revision A12 and below
417 * 0x2c00 for ASIC revision A13 and above.*/
418 pci_conf1_write_config16(dev, 0x86, 0x2C00);
420 /* PHY Port0-3 Control */
421 pci_conf1_write_config32(dev, 0x88, 0xB400DA);
422 pci_conf1_write_config32(dev, 0x8c, 0xB400DA);
423 pci_conf1_write_config32(dev, 0x90, 0xB400DA);
424 pci_conf1_write_config32(dev, 0x94, 0xB400DA);
426 /* Port0-3 BIST Control/Status */
427 pci_conf1_write_config8(dev, 0xa5, 0xB8);
428 pci_conf1_write_config8(dev, 0xad, 0xB8);
429 pci_conf1_write_config8(dev, 0xb5, 0xB8);
430 pci_conf1_write_config8(dev, 0xbd, 0xB8);
433 /* sbPmioPorInitTable, Pre-initializing PMIO register space
434 * The power management (PM) block is resident in the PCI/LPC/ISA bridge.
435 * The PM regs are accessed via IO mapped regs 0xcd6 and 0xcd7.
436 * The index address is first programmed into IO reg 0xcd6.
437 * Read or write values are accessed through IO reg 0xcd7.
439 static void sb600_pmio_por_init()
443 printk(BIOS_INFO, "sb600_pmio_por_init()\n");
444 /* K8KbRstEn, KB_RST# control for K8 system. */
445 byte = pmio_read(0x66);
447 pmio_write(0x66, byte);
449 /* RPR2.3.4 S3/S4/S5 Function for the K8 Platform. */
450 byte = pmio_read(0x52);
453 pmio_write(0x52, byte);
455 /* C state enable and SLP enable in C states. */
456 byte = pmio_read(0x67);
458 pmio_write(0x67, byte);
460 /* CIM sets 0x0e, but bit2 is for P4 system. */
461 byte = pmio_read(0x68);
464 pmio_write(0x68, byte);
466 /* Watch Dog Timer Control
467 * Set watchdog time base to 0xfec000f0 to avoid SCSI card boot failure.
468 * But I don't find WDT is enabled in SMBUS 0x41 bit3 in CIM.
470 pmio_write(0x6c, 0xf0);
471 pmio_write(0x6d, 0x00);
472 pmio_write(0x6e, 0xc0);
473 pmio_write(0x6f, 0xfe);
475 /* rpr2.14: Enables HPET periodical mode */
476 byte = pmio_read(0x9a);
478 pmio_write(0x9a, byte);
479 byte = pmio_read(0x9f);
481 pmio_write(0x9f, byte);
482 byte = pmio_read(0x9e);
483 byte |= (1 << 6) | (1 << 7);
484 pmio_write(0x9e, byte);
486 /* rpr2.14: Hides SM bus controller Bar1 where stores HPET MMIO base address */
487 byte = pmio_read(0x55);
489 pmio_write(0x55, byte);
491 /* rpr2.14: Make HPET MMIO decoding controlled by the memory enable bit in command register of LPC ISA bridage */
492 byte = pmio_read(0x52);
494 pmio_write(0x52, byte);
496 /* rpr2.22: PLL Reset */
497 byte = pmio_read(0x86);
499 pmio_write(0x86, byte);
502 /* This provides 16us delay before the assertion of LDTSTP# when C3 is entered.
503 * The delay will allow USB DMA to go on in a continuous manner
505 pmio_write(0x89, 0x10);
506 /* Set this bit to allow pop-up request being latched during the minimum LDTSTP# assertion time */
507 byte = pmio_read(0x52);
509 pmio_write(0x52, byte);
511 /* rpr2.15: ASF Remote Control Action */
512 byte = pmio_read(0x9f);
514 pmio_write(0x9f, byte);
516 /* rpr2.19: Enabling Spread Spectrum */
517 byte = pmio_read(0x42);
519 pmio_write(0x42, byte);
523 * Compliant with CIM_48's sbPciCfg.
524 * Add any south bridge setting.
526 static void sb600_pci_cfg()
531 /* SMBus Device, BDF:0-20-0 */
532 pci_conf1_find_device(0x1002, 0x4385, &dev);
533 /* Eable the hidden revision ID, available after A13. */
534 byte = pci_conf1_read_config8(dev, 0x70);
536 pci_conf1_write_config8(dev, 0x70, byte);
537 /* rpr2.20 Disable Timer IRQ Enhancement for proper operation of the 8254 timer, 0xae[5]. */
538 byte = pci_conf1_read_config8(dev, 0xae);
540 pci_conf1_write_config8(dev, 0xae, byte);
542 /* Enable watchdog decode timer */
543 byte = pci_conf1_read_config8(dev, 0x41);
545 pci_conf1_write_config8(dev, 0x41, byte);
547 /* Set to 1 to reset USB on the software (such as IO-64 or IO-CF9 cycles)
548 * generated PCIRST#. */
549 byte = pmio_read(0x65);
551 pmio_write(0x65, byte);
552 /*For A13 and above. */
553 if (get_sb600_revision() > 0x12) {
554 /* rpr2.16 C-State Reset, PMIO 0x9f[7]. */
555 byte = pmio_read(0x9f);
557 pmio_write(0x9f, byte);
558 /* rpr2.17 PCI Clock Period will increase to 30.8ns. 0x53[7]. */
559 byte = pmio_read(0x53);
561 pmio_write(0x53, byte);
564 /* IDE Device, BDF:0-20-1 */
565 pci_conf1_find_device(0x1002, 0x438C, &dev);
566 /* Enable IDE Explicit prefetch, 0x63[0] clear */
567 byte = pci_conf1_read_config8(dev, 0x63);
569 pci_conf1_write_config8(dev, 0x63, byte);
571 /* LPC Device, BDF:0-20-3 */
572 pci_conf1_find_device(0x1002, 0x438D, &dev);
573 /* rpr7.2 Enabling LPC DMA function. */
574 byte = pci_conf1_read_config8(dev, 0x40);
576 pci_conf1_write_config8(dev, 0x40, byte);
577 /* rpr7.3 Disabling LPC TimeOut. 0x48[7] clear. */
578 byte = pci_conf1_read_config8(dev, 0x48);
580 pci_conf1_write_config8(dev, 0x48, byte);
581 /* rpr7.5 Disabling LPC MSI Capability, 0x78[1] clear. */
582 byte = pci_conf1_read_config8(dev, 0x78);
584 pci_conf1_write_config8(dev, 0x78, byte);
586 /* SATA Device, BDF:0-18-0, Non-Raid-5 SATA controller */
587 pci_conf1_find_device(0x1002, 0x4380, &dev);
588 /* rpr6.8 Disabling SATA MSI Capability, for A13 and above, 0x42[7]. */
589 if (0x12 < get_sb600_revision()) {
591 reg32 = pci_conf1_read_config32(dev, 0x40);
593 pci_conf1_write_config32(dev, 0x40, reg32);
596 /* EHCI Device, BDF:0-19-5, ehci usb controller */
597 pci_conf1_find_device(0x1002, 0x4386, &dev);
598 /* rpr5.10 Disabling USB EHCI MSI Capability. 0x50[6]. */
599 byte = pci_conf1_read_config8(dev, 0x50);
601 pci_conf1_write_config8(dev, 0x50, byte);
603 /* OHCI0 Device, BDF:0-19-0, ohci usb controller #0 */
604 pci_conf1_find_device(0x1002, 0x4387, &dev);
605 /* rpr5.11 Disabling USB OHCI MSI Capability. 0x40[12:8]=0x1f. */
606 byte = pci_conf1_read_config8(dev, 0x41);
608 pci_conf1_write_config8(dev, 0x41, byte);
613 * Compliant with CIM_48's ATSBPowerOnResetInitJSP
615 static void sb600_por_init()
617 /* sbDevicesPorInitTable + sbK8PorInitTable */
618 sb600_devices_por_init();
620 /* sbPmioPorInitTable + sbK8PmioPorInitTable */
621 sb600_pmio_por_init();
625 * Compliant with CIM_48's AtiSbBeforePciInit
626 * It should be called during early POST after memory detection and BIOS shadowing but before PCI bus enumeration.
628 static void sb600_before_pci_init()
634 * This function should be called after enable_sb600_smbus().
636 static void sb600_stage1(void)
638 printk(BIOS_INFO, "sb600_early_setup()\n");