Hi AAron
I just checked the stuff I know from other VIA chipsets, the mem init and configs I skipped, perhaps it is OK.
Index: src/include/device/pci_ids.h
--- src/include/device/pci_ids.h (revision 3321) +++ src/include/device/pci_ids.h (working copy) @@ -1160,6 +1160,7 @@ #define PCI_DEVICE_ID_VIA_K8T890CE_BR 0xb188 #define PCI_DEVICE_ID_VIA_VT6420_SATA 0x3149 #define PCI_DEVICE_ID_VIA_VT8237R_LPC 0x3227 +#define PCI_DEVICE_ID_VIA_VT8237R_SATA 0x3149
Why not use PCI_DEVICE_ID_VIA_VT6420_SATA as I did?
#define PCI_DEVICE_ID_VIA_CN700_AGP 0x0314 #define PCI_DEVICE_ID_VIA_CN700_ERR 0x1314 #define PCI_DEVICE_ID_VIA_CN700_HOST 0x2314 +}
+#include "northbridge/via/cn700/raminit.c"
+static void enable_mainboard_devices(void) +{
- device_t dev;
- u8 reg;
/*
- If I enbale sata, filo will not find the ide disk, so I'll disable sata here
- To not conflict with pci sepc, I'll move ide device from 00:0f.1 to 00:0f.0
Please try attached patch. Thanks. I'm booting from first SATA at filo with hd0 as first SATA and second sata as hd2 imho the first ide disk will be hd4.
- */
- dev = pci_locate_device(PCI_ID(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT8237R_SATA), 0);
- if (dev != PCI_DEV_INVALID) {
/* enable backdoor */
reg = pci_read_config8(dev, 0xd1);
reg |= 0x08;
pci_write_config8(dev, 0xd1, reg);
/* enable pata */
reg = pci_read_config8(dev, 0x49);
reg |= 0x80;
pci_write_config8(dev, 0x49, reg);
- }
- else
snip
/* AGTL+ Compensation Status */ @@ -135,206 +133,297 @@ pci_write_config8(dev, 0x79, 0xaa); /* Address Strobe Input Delay Control */ pci_write_config8(dev, 0x7a, 0x24);
- /* Address CKG Rising/Falling Time Control */
- pci_write_config8(dev, 0x7b, 0x00);
- // Address CKG Rising/Falling Time Control
- pci_write_config8(dev, 0x7b, 0xaa); /* Address CKG Clock Rising/Falling Time Control */ pci_write_config8(dev, 0x7c, 0x00); /* Undefined (can't remember why I did this) */
lol ;)
- pci_write_config8(dev, 0x7d, 0x6d);
- pci_write_config8(dev, 0x7d, 0x6d);
- pci_write_config8(dev, 0x7e, 0x00);
- pci_write_config8(dev, 0x7f, 0x00);
- pci_write_config8(dev, 0x80, 0x1b);
- pci_write_config8(dev, 0x81, 0x0a);
- pci_write_config8(dev, 0x82, 0x0a);
- pci_write_config8(dev, 0x83, 0x0a);
- /* VLink Control */
- pci_write_config8(ctrl->d0f7, 0xb0, 0x05);
- pci_write_config8(ctrl->d0f7, 0xb1, 0x01);
Just a question do you have in plan to support also some other pairs like VT8237A/S?
- pci_write_config8(ctrl->d0f3, 0x86, 0x29);
- /* SMM and APIC decoding mirror */
- pci_write_config8(ctrl->d0f7, 0xe6, 0x29);
Hmm too dangerous please can you copy 0x86 reg to 0xe6?
- /* Disable cross bank/multi page mode */
- pci_write_config8(ctrl->d0f3, DDR_PAGE_CTL, 0x80);
Index: src/northbridge/via/cn700/northbridge.c
--- src/northbridge/via/cn700/northbridge.c (revision 3321) +++ src/northbridge/via/cn700/northbridge.c (working copy) @@ -1,6 +1,8 @@ /*
- This file is part of the coreboot project.
- Copyright (C) 2008 VIA Technologies, Inc.
- (Written by Aaron Lwe aaron.lwe@gmail.com for VIA)
- Copyright (C) 2007 Corey Osgood corey.osgood@gmail.com
- This program is free software; you can redistribute it and/or modify
@@ -35,9 +37,8 @@ static void memctrl_init(device_t dev) { u16 reg16;
- u8 ranks;
- pci_write_config8(dev, 0x86, 0x2d);
- /* Set up the vga framebuffer size */ reg16 = (log2(CONFIG_VIDEO_MB) << 12) | (1 << 15); pci_write_config16(dev, 0xa0, reg16);
@@ -45,8 +46,41 @@ /* Set up VGA timers */ pci_write_config8(dev, 0xa2, 0x44);
- pci_write_config16(dev, 0xb0, 0xaa60);
- for (ranks = 0x4b; ranks >= 0x48; ranks--) {
if (pci_read_config8(dev, ranks)) {
ranks -= 0x48;
break;
}
- }
- if (ranks == 0x47)
ranks = 0x00;
- reg16 = 0xaae0;
- reg16 |= ranks;
- /* GMINT Misc. FrameBuffer rank */
- pci_write_config16(dev, 0xb0, reg16);
- /* AGPCINT Misc. */ pci_write_config8(dev, 0xb8, 0x08);
- /* shadown ram */
- u8 shadowreg;
- shadowreg = pci_read_config8(dev, 0x83);
- /* 0xf0000-0xfffff */
- shadowreg |= 0x30;
- pci_write_config8(dev, 0x83, shadowreg);
- /* PAGE C, D, E are all read write enable */
- pci_write_config8(dev, 0x80, 0xff);
- pci_write_config8(dev, 0x81, 0xff);
- pci_write_config8(dev, 0x82, 0xff);
- /* vlink mirror */
Again here please can you do the copy of registers or someone else will forgot that below ff MUST be same as above ;)
- dev = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_CN700_VLINK, 0);
- if (dev) {
pci_write_config8(dev, 0x61, 0xff);
pci_write_config8(dev, 0x62, 0xff);
pci_write_config8(dev, 0x64, 0xff);
shadowreg = pci_read_config8(dev, 0x63);
shadowreg |= 0x30;
pci_write_config8(dev, 0x63, shadowreg);
This is tricky with other then VT8237R there is new registers for whole range. Please can you check if it is OK I mean that only two bits are for the whole region? Typical symptoms are random disk read lockup and controller reset - when DMA goes to the region of 0xE0000-0xEFFFF.
Here is my note from: http://tracker.coreboot.org/trac/coreboot/browser/trunk/coreboot-v2/src/sout...
/* * All access bits for 0xE0000-0xEFFFF encode as just 2 bits! * So the NB reg is quite inconsistent, we expect there only 0xff or 0x00, * and write them to 0x63 7-6 but! VIA 8237A has the mirror at 0x64! */
Rudolf