Hi,
This is a working patch for epia-cn which uses C7 + CN700 + VT8237R. Signed-off-by: Aaron Lwe aaron.lwe@gmail.com
-Aaron
Hi Aaron,
On Tue, May 13, 2008 at 05:40:43PM +0800, aaron lwe wrote:
This is a working patch for epia-cn which uses C7 + CN700 + VT8237R. Signed-off-by: Aaron Lwe aaron.lwe@gmail.com
Cool!
Index: src/mainboard/via/epia-cn/dsdt.c
--- src/mainboard/via/epia-cn/dsdt.c (revision 0) +++ src/mainboard/via/epia-cn/dsdt.c (revision 0) @@ -0,0 +1,2487 @@ +/*
- Intel ACPI Component Architecture
- ASL Optimizing Compiler version 20061109 [Aug 11 2007]
- Copyright (C) 2000 - 2006 Intel Corporation
- Supports ACPI Specification Revision 3.0a
- Compilation of "dsdt.dsl" - Mon Jan 28 11:04:07 2008
- C source code output
- */
Do you have the dsdt.dsl source? Where did it come from?
Index: src/mainboard/via/epia-cn/fadt.c
--- src/mainboard/via/epia-cn/fadt.c (revision 0) +++ src/mainboard/via/epia-cn/fadt.c (revision 0) @@ -0,0 +1,154 @@ +/*
- ACPI - create the Fixed ACPI Description Tables (FADT)
- Copyright (C) 2004 Nick Barker nick.barker9@btinternet.com
Did you change anything in this file? Then I think you should add your copyright, possibly even remove Nick's.
+void acpi_create_fadt(acpi_fadt_t *fadt,acpi_facs_t *facs,void *dsdt){
- acpi_header_t *header=&(fadt->header);
- memset((void *)fadt,0,sizeof(acpi_fadt_t));
- memcpy(header->signature,"FACP",4);
- header->length = 244;
- header->revision = 1;
- memcpy(header->oem_id,"CN700 ",6);
- memcpy(header->oem_table_id,"AWRDACPI",8);
- memcpy(header->asl_compiler_id,"AWRD",4);
We are not Award. What is this about?
- header->asl_compiler_revision=0;
- fadt->firmware_ctrl=facs;
- fadt->dsdt= dsdt;
- fadt->preferred_pm_profile=0;
- fadt->sci_int=9;
- fadt->smi_cmd = 0x0;
- fadt->acpi_enable = 0x0;
- fadt->acpi_disable = 0x0;
- fadt->s4bios_req = 0x0;
- fadt->pstate_cnt = 0x0;
- fadt->pm1a_evt_blk = 0x400;
- fadt->pm1b_evt_blk = 0x0;
- fadt->pm1a_cnt_blk = 0x404;
- fadt->pm1b_cnt_blk = 0x0;
- fadt->pm2_cnt_blk = 0x0;
- fadt->pm_tmr_blk = 0x408;
- fadt->gpe0_blk = 0x420;
- fadt->gpe1_blk = 0x0;
Where do all these magic values come from?
-/**
- Configure the bus between the cpu and the northbridge. This might be able to
- be moved to post-ram code in the future. For the most part, these registers
- should not be messed around with. These are too complex to explain short of
- copying the datasheets into the comments, but most of these values are from
- the BIOS Porting Guide, so they should work on any board. If they don't,
- try the values from your factory BIOS.
- TODO: Changing the DRAM frequency doesn't work (hard lockup)
- @param dev The northbridge's CPU Host Interface (D0F2)
- */
static void c7_cpu_setup(device_t dev) {
Hey, please don't remove doxygen. :)
Index: src/northbridge/via/cn700/northbridge.c
--- src/northbridge/via/cn700/northbridge.c (revision 3300) +++ 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.
- Copyright (C) 2008 Aaron Lwe aaron.lwe@gmail.com
How is VIA involved in this?
Thanks a lot for the patch! I guess Corey and Bari will have a go at it but I'll try to test as well.
//Peter
Hi all
Here are some quick comments. Most notable on things I know. I may have more time later this week.
Rudolf
#define VT8237R_APIC_ID 0x2 -#define VT8237R_ACPI_IO_BASE 0x500 -#define VT8237R_SMBUS_IO_BASE 0x400 +#define VT8237R_ACPI_IO_BASE 0x400 +#define VT8237R_SMBUS_IO_BASE 0x500
Why? You need this for the ACPI DSDT?
/* 0x0 disable
Index: src/mainboard/via/epia-cn/fadt.c
--- src/mainboard/via/epia-cn/fadt.c (revision 0) +++ src/mainboard/via/epia-cn/fadt.c (revision 0) @@ -0,0 +1,154 @@ +/*
- ACPI - create the Fixed ACPI Description Tables (FADT)
- Copyright (C) 2004 Nick Barker nick.barker9@btinternet.com
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of
- the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- MA 02110-1301 USA
- */
+#include <string.h> +#include <arch/acpi.h>
+void acpi_create_fadt(acpi_fadt_t *fadt,acpi_facs_t *facs,void *dsdt){
- acpi_header_t *header=&(fadt->header);
- memset((void *)fadt,0,sizeof(acpi_fadt_t));
- memcpy(header->signature,"FACP",4);
- header->length = 244;
- header->revision = 1;
- memcpy(header->oem_id,"CN700 ",6);
- memcpy(header->oem_table_id,"AWRDACPI",8);
- memcpy(header->asl_compiler_id,"AWRD",4);
- header->asl_compiler_revision=0;
- fadt->firmware_ctrl=facs;
- fadt->dsdt= dsdt;
- fadt->preferred_pm_profile=0;
- fadt->sci_int=9;
- fadt->smi_cmd = 0x0;
- fadt->acpi_enable = 0x0;
- fadt->acpi_disable = 0x0;
- fadt->s4bios_req = 0x0;
- fadt->pstate_cnt = 0x0;
- fadt->pm1a_evt_blk = 0x400;
- fadt->pm1b_evt_blk = 0x0;
- fadt->pm1a_cnt_blk = 0x404;
- fadt->pm1b_cnt_blk = 0x0;
- fadt->pm2_cnt_blk = 0x0;
- fadt->pm_tmr_blk = 0x408;
- fadt->gpe0_blk = 0x420;
- fadt->gpe1_blk = 0x0;
- fadt->pm1_evt_len = 4;
- fadt->pm1_cnt_len = 2;
- fadt->pm2_cnt_len = 1;
- fadt->pm_tmr_len = 4;
- fadt->gpe0_blk_len = 4;
- fadt->gpe1_blk_len = 0;
- fadt->gpe1_base = 0;
- fadt->cst_cnt = 0;
- fadt->p_lvl2_lat = 0x50; //90;
- fadt->p_lvl3_lat = 0x320; //900;
- fadt->flush_size = 0;
- fadt->flush_stride = 0;
- fadt->duty_offset = 0;
- fadt->duty_width = 1;
- fadt->day_alrm = 0x7d;
- fadt->mon_alrm = 0x7e;
- fadt->century = 0x32;
- fadt->iapc_boot_arch = 0x0;
- fadt->flags = 0x4a5;
- fadt->reset_reg.space_id = 0;
- fadt->reset_reg.bit_width = 0;
- fadt->reset_reg.bit_offset = 0;
- fadt->reset_reg.resv = 0;
- fadt->reset_reg.addrl = 0x0;
- fadt->reset_reg.addrh = 0x0;
- fadt->reset_value = 0;
- fadt->x_firmware_ctl_l = facs;
- fadt->x_firmware_ctl_h = 0;
- fadt->x_dsdt_l = dsdt;
- fadt->x_dsdt_h = 0;
- fadt->x_pm1a_evt_blk.space_id = 1;
- fadt->x_pm1a_evt_blk.bit_width = 4;
- fadt->x_pm1a_evt_blk.bit_offset = 0;
- fadt->x_pm1a_evt_blk.resv = 0;
- fadt->x_pm1a_evt_blk.addrl = 0x400;
- fadt->x_pm1a_evt_blk.addrh = 0x0;
- fadt->x_pm1b_evt_blk.space_id = 1;
- fadt->x_pm1b_evt_blk.bit_width = 4;
- fadt->x_pm1b_evt_blk.bit_offset = 0;
- fadt->x_pm1b_evt_blk.resv = 0;
- fadt->x_pm1b_evt_blk.addrl = 0x0;
- fadt->x_pm1b_evt_blk.addrh = 0x0;
- fadt->x_pm1a_cnt_blk.space_id = 1;
- fadt->x_pm1a_cnt_blk.bit_width = 2;
- fadt->x_pm1a_cnt_blk.bit_offset = 0;
- fadt->x_pm1a_cnt_blk.resv = 0;
- fadt->x_pm1a_cnt_blk.addrl = 0x404;
- fadt->x_pm1a_cnt_blk.addrh = 0x0;
- fadt->x_pm1b_cnt_blk.space_id = 1;
- fadt->x_pm1b_cnt_blk.bit_width = 2;
- fadt->x_pm1b_cnt_blk.bit_offset = 0;
- fadt->x_pm1b_cnt_blk.resv = 0;
- fadt->x_pm1b_cnt_blk.addrl = 0x0;
- fadt->x_pm1b_cnt_blk.addrh = 0x0;
- fadt->x_pm2_cnt_blk.space_id = 1;
- fadt->x_pm2_cnt_blk.bit_width = 0;
- fadt->x_pm2_cnt_blk.bit_offset = 0;
- fadt->x_pm2_cnt_blk.resv = 0;
- fadt->x_pm2_cnt_blk.addrl = 0x0;
- fadt->x_pm2_cnt_blk.addrh = 0x0;
- fadt->x_pm_tmr_blk.space_id = 1;
- fadt->x_pm_tmr_blk.bit_width = 4;
- fadt->x_pm_tmr_blk.bit_offset = 0;
- fadt->x_pm_tmr_blk.resv = 0;
- fadt->x_pm_tmr_blk.addrl = 0x408;
- fadt->x_pm_tmr_blk.addrh = 0x0;
- fadt->x_gpe0_blk.space_id = 1;
- fadt->x_gpe0_blk.bit_width = 0;
- fadt->x_gpe0_blk.bit_offset = 0;
- fadt->x_gpe0_blk.resv = 0;
- fadt->x_gpe0_blk.addrl = 0x420;
- fadt->x_gpe0_blk.addrh = 0x0;
- fadt->x_gpe1_blk.space_id = 1;
- fadt->x_gpe1_blk.bit_width = 0;
- fadt->x_gpe1_blk.bit_offset = 0;
- fadt->x_gpe1_blk.resv = 0;
- fadt->x_gpe1_blk.addrl = 0x0;
- fadt->x_gpe1_blk.addrh = 0x0;
- header->checksum = acpi_checksum((void *)fadt, sizeof(acpi_fadt_t));
Please do not hardcode the ports and use the defines as I did for asus a8v-e
+} Index: src/mainboard/via/epia-cn/Config.lb =================================================================== --- src/mainboard/via/epia-cn/Config.lb (revision 0) +++ src/mainboard/via/epia-cn/Config.lb (revision 0) @@ -0,0 +1,218 @@ +## +## This file is part of the coreboot project. +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +##
+## +## Compute the location and size of where this firmware image +## (coreboot plus bootloader) will live in the boot rom chip. +## +if USE_FALLBACK_IMAGE
- default ROM_SECTION_SIZE = FALLBACK_SIZE
- default ROM_SECTION_OFFSET = ( ROM_SIZE - FALLBACK_SIZE )
+else
- default ROM_SECTION_SIZE = ( ROM_SIZE - FALLBACK_SIZE )
- default ROM_SECTION_OFFSET = 0
+end
+## +## Compute the start location and size size of +## The coreboot bootloader. +## +default PAYLOAD_SIZE = ( ROM_SECTION_SIZE - ROM_IMAGE_SIZE ) +default CONFIG_ROM_PAYLOAD_START = (0xffffffff - ROM_SIZE + ROM_SECTION_OFFSET + 1)
+## +## Compute where this copy of coreboot will start in the boot rom +## +default _ROMBASE = ( CONFIG_ROM_PAYLOAD_START + PAYLOAD_SIZE )
+## +## Compute a range of ROM that can cached to speed up coreboot, +## execution speed. +## +## XIP_ROM_SIZE must be a power of 2. +## XIP_ROM_BASE must be a multiple of XIP_ROM_SIZE +## +default XIP_ROM_SIZE=0x10000 +default XIP_ROM_BASE = ( _ROMBASE + ROM_IMAGE_SIZE - XIP_ROM_SIZE )
+## +## Set all of the defaults for an x86 architecture +##
+arch i386 end
+## +## Build the objects we have code for in this directory. +##
+driver mainboard.o +if HAVE_PIRQ_TABLE object irq_tables.o end
+if HAVE_MP_TABLE object mptable.o end
+if HAVE_ACPI_TABLES
- object fadt.o
- object dsdt.o
- object acpi_tables.o
+end
+## +## Romcc output +## +makerule ./failover.E
- depends "$(MAINBOARD)/failover.c ./romcc"
- action "./romcc -E -O --label-prefix=failover -I$(TOP)/src -I. $(CPPFLAGS) $(MAINBOARD)/failover.c -o $@"
+end
+makerule ./failover.inc
- depends "$(MAINBOARD)/failover.c ./romcc"
- action "./romcc -O --label-prefix=failover -I$(TOP)/src -I. $(CPPFLAGS) $(MAINBOARD)/failover.c -o $@"
+end
+makerule ./auto.E
- depends "$(MAINBOARD)/auto.c option_table.h ./romcc"
- action "./romcc -E -mcpu=c3 -O -I$(TOP)/src -I. $(CPPFLAGS) $(MAINBOARD)/auto.c -o $@"
+end +makerule ./auto.inc
- depends "$(MAINBOARD)/auto.c option_table.h ./romcc"
- action "./romcc -mcpu=c3 -O -I$(TOP)/src -I. $(CPPFLAGS) $(MAINBOARD)/auto.c -o $@"
+end
+## +## Build our 16 bit and 32 bit coreboot entry code +## +mainboardinit cpu/x86/16bit/entry16.inc +mainboardinit cpu/x86/32bit/entry32.inc +ldscript /cpu/x86/16bit/entry16.lds +ldscript /cpu/x86/32bit/entry32.lds
+## +## Build our reset vector (This is where coreboot is entered) +## +if USE_FALLBACK_IMAGE
- mainboardinit cpu/x86/16bit/reset16.inc
- ldscript /cpu/x86/16bit/reset16.lds
+else
- mainboardinit cpu/x86/32bit/reset32.inc
- ldscript /cpu/x86/32bit/reset32.lds
+end
+### Should this be in the northbridge code? +mainboardinit arch/i386/lib/cpu_reset.inc
+## +## Include an id string (For safe flashing) +## +mainboardinit arch/i386/lib/id.inc +ldscript /arch/i386/lib/id.lds
+### +### This is the early phase of coreboot startup +### Things are delicate and we test to see if we should +### failover to another image. +### +if USE_FALLBACK_IMAGE
- ldscript /arch/i386/lib/failover.lds
- mainboardinit ./failover.inc
+end
+### +### O.k. We aren't just an intermediary anymore! +###
+## +## Setup RAM +## +mainboardinit cpu/x86/fpu/enable_fpu.inc +mainboardinit cpu/x86/mmx/enable_mmx.inc +mainboardinit ./auto.inc +mainboardinit cpu/x86/mmx/disable_mmx.inc
+## +## Include the secondary Configuration files +## +dir /pc80 +config chip.h
+chip northbridge/via/cn700
- device pci_domain 0 on
device pci 0.0 on end # AGP Bridge
device pci 0.1 on end # Error Reporting
device pci 0.2 on end # Host Bus Control
device pci 0.3 on end # Memory Controller
device pci 0.4 on end # Power Management
device pci 0.7 on end # V-Link Controller
device pci 1.0 on # PCI Bridge
+# chip drivers/pci/onboard +# device pci 0.0 on end +# register "rom_address" = "0xfff80000" #512k image +# end # Onboard Video
end # PCI Bridge
chip southbridge/via/vt8237r
#both IDE channels
register "ide0_enable" = "1"
register "ide1_enable" = "1"
#both cables are 80pin
register "ide0_80pin_cable" = "0"
register "ide1_80pin_cable" = "0"
device pci f.0 on end # IDE
register "fn_ctrl_lo" = "0x8a"
register "fn_ctrl_hi" = "0x9d"
device pci 10.0 on end # USB 1.1
device pci 10.1 on end # USB 1.1
device pci 10.2 on end # USB 1.1
device pci 10.3 on end # USB 1.1
device pci 11.0 on # Southbridge LPC
chip superio/via/vt1211
device pnp 2e.0 off # Floppy
io 0x60 = 0x3f0
irq 0x70 = 6
drq 0x74 = 2
end
device pnp 2e.1 on # Parallel Port
io 0x60 = 0x378
irq 0x70 = 7
drq 0x74 = 3
end
device pnp 2e.2 on # COM1
io 0x60 = 0x3f8
irq 0x70 = 4
end
#device pnp 2e.3 on # COM2
# io 0x60 = 0x2f8
# irq 0x70 = 3
#end
device pnp 2e.b on # HWM
io 0x60 = 0xec00
end
end #superio
end # pci 11.0
# 1-4 non existant
device pci 11.5 on end # AC97 Audio
#device pci 11.6 off end # AC97 Modem
device pci 12.0 on end # Ethernet
end # vt8237
- end # pci domain 0
- device apic_cluster 0 on
chip cpu/via/model_c7
device apic 0 on end
end
- end
+end # cn700 Index: src/mainboard/via/epia-cn/irq_tables.c =================================================================== --- src/mainboard/via/epia-cn/irq_tables.c (revision 0) +++ src/mainboard/via/epia-cn/irq_tables.c (revision 0) @@ -0,0 +1,48 @@ +/* This file was generated by getpir.c, do not modify!
- (but if you do, please run checkpir on it to verify)
- Contains the IRQ Routing Table dumped directly from your
- memory, which BIOS sets up.
- Documentation at: http://www.microsoft.com/whdc/archive/pciirq.mspx
- */
+#ifdef GETPIR +#include "pirq_routing.h" +#else +#include <arch/pirq_routing.h> +#endif
+const struct irq_routing_table intel_irq_routing_table = {
- PIRQ_SIGNATURE, /* u32 signature */
- PIRQ_VERSION, /* u16 version */
- 32+16*10, /* There can be total 10 devices on the bus */
- 0x00, /* Where the interrupt router lies (bus) */
- (0x11<<3)|0x0, /* Where the interrupt router lies (dev) */
- 0x828, /* IRQs devoted exclusively to PCI usage */
- 0x1106, /* Vendor */
- 0x596, /* Device */
- 0, /* Crap (miniport) */
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* u8 rfu[11] */
- 0x3e, /* u8 checksum. This has to be set to some
value that would give 0 after the sum of all
bytes for this structure (including checksum) */
- {
/* bus, dev|fn, {link, bitmap}, {link, bitmap}, {link, bitmap}, {link, bitmap}, slot, rfu */
{0x00,(0x08<<3)|0x0, {{0x01, 0xdef8}, {0x02, 0xdef8}, {0x03, 0xdef8}, {0x05, 0x0def8}}, 0x1, 0x0},
{0x00,(0x09<<3)|0x0, {{0x02, 0xdef8}, {0x03, 0xdef8}, {0x05, 0xdef8}, {0x01, 0x0def8}}, 0x2, 0x0},
{0x00,(0x0a<<3)|0x0, {{0x03, 0xdef8}, {0x05, 0xdef8}, {0x01, 0xdef8}, {0x02, 0x0def8}}, 0x3, 0x0},
{0x00,(0x0b<<3)|0x0, {{0x05, 0xdef8}, {0x01, 0xdef8}, {0x02, 0xdef8}, {0x03, 0x0def8}}, 0x4, 0x0},
{0x00,(0x0c<<3)|0x0, {{0x01, 0xdef8}, {0x02, 0xdef8}, {0x03, 0xdef8}, {0x05, 0x0def8}}, 0x5, 0x0},
{0x00,(0x11<<3)|0x0, {{0x00, 0xdef8}, {0x00, 0xdef8}, {0x03, 0xdef8}, {0x05, 0x0def8}}, 0x0, 0x0},
{0x00,(0x0f<<3)|0x0, {{0x01, 0xdef8}, {0x02, 0xdef8}, {0x03, 0xdef8}, {0x05, 0x0def8}}, 0x0, 0x0},
{0x00,(0x01<<3)|0x0, {{0x01, 0xdef8}, {0x02, 0xdef8}, {0x03, 0xdef8}, {0x05, 0x0def8}}, 0x0, 0x0},
{0x00,(0x10<<3)|0x0, {{0x01, 0xdef8}, {0x02, 0xdef8}, {0x03, 0xdef8}, {0x05, 0x0def8}}, 0x0, 0x0},
{0x00,(0x12<<3)|0x0, {{0x01, 0xdef8}, {0x00, 0xdef8}, {0x00, 0xdef8}, {0x00, 0x0def8}}, 0x0, 0x0},
- }
+};
+unsigned long write_pirq_routing_table(unsigned long addr) +{
return copy_pirq_routing_table(addr);
+} Index: src/mainboard/via/epia-cn/debug.c =================================================================== --- src/mainboard/via/epia-cn/debug.c (revision 0) +++ src/mainboard/via/epia-cn/debug.c (revision 0) @@ -0,0 +1,142 @@
+static void print_debug_pci_dev(unsigned dev) +{
- print_debug("PCI: ");
- print_debug_hex8((dev >> 16) & 0xff);
- print_debug_char(':');
- print_debug_hex8((dev >> 11) & 0x1f);
- print_debug_char('.');
- print_debug_hex8((dev >> 8) & 7);
+}
+static void print_pci_devices(void) +{
- device_t dev;
- for(dev = PCI_DEV(0, 0, 0);
dev <= PCI_DEV(0, 0x1f, 0x7);
dev += PCI_DEV(0,0,1)) {
print_debug("device being printed is 0x");
print_debug_hex32(dev);
print_debug("\r\n");
uint32_t id;
id = pci_read_config32(dev, PCI_VENDOR_ID);
if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) ||
(((id >> 16) & 0xffff) == 0xffff) ||
(((id >> 16) & 0xffff) == 0x0000)) {
continue;
}
print_debug_pci_dev(dev);
print_debug("\r\n");
- }
+}
+static void dump_pci_device(unsigned dev) +{
- int i;
- print_debug_pci_dev(dev);
- print_debug("\r\n");
- for(i = 0; i <= 255; i++) {
unsigned char val;
if ((i & 0x0f) == 0) {
print_debug_hex8(i);
print_debug_char(':');
}
val = pci_read_config8(dev, i);
print_debug_char(' ');
print_debug_hex8(val);
if ((i & 0x0f) == 0x0f) {
print_debug("\r\n");
}
- }
+}
+static void dump_pci_devices(void) +{
- device_t dev;
- for(dev = PCI_DEV(0, 0, 0);
dev <= PCI_DEV(0, 0x1f, 0x7);
dev += PCI_DEV(0,0,1)) {
uint32_t id;
id = pci_read_config32(dev, PCI_VENDOR_ID);
if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) ||
(((id >> 16) & 0xffff) == 0xffff) ||
(((id >> 16) & 0xffff) == 0x0000)) {
continue;
}
dump_pci_device(dev);
- }
+} +#if 0 +static void dump_spd_registers(const struct mem_controller *ctrl) +{
- int i;
- print_debug("\r\n");
- for(i = 0; i < 4; i++) {
unsigned device;
device = ctrl->channel0[i];
if (device) {
int j;
print_debug("dimm: ");
print_debug_hex8(i);
print_debug(".0: ");
print_debug_hex8(device);
for(j = 0; j < 256; j++) {
int status;
unsigned char byte;
if ((j & 0xf) == 0) {
print_debug("\r\n");
print_debug_hex8(j);
print_debug(": ");
}
status = smbus_read_byte(device, j);
if (status < 0) {
print_debug("bad device\r\n");
break;
}
byte = status & 0xff;
print_debug_hex8(byte);
print_debug_char(' ');
}
print_debug("\r\n");
}
device = ctrl->channel1[i];
if (device) {
int j;
print_debug("dimm: ");
print_debug_hex8(i);
print_debug(".1: ");
print_debug_hex8(device);
for(j = 0; j < 256; j++) {
int status;
unsigned char byte;
if ((j & 0xf) == 0) {
print_debug("\r\n");
print_debug_hex8(j);
print_debug(": ");
}
status = smbus_read_byte(device, j);
if (status < 0) {
print_debug("bad device\r\n");
break;
}
byte = status & 0xff;
print_debug_hex8(byte);
print_debug_char(' ');
}
print_debug("\r\n");
}
- }
+} +#endif
+void print_debug_val8(unsigned dev, u8 offset) +{
- print_debug("dump value for device ");
- print_debug_hex32(dev);
- print_debug(" offset 0x");
- print_debug_hex8(offset);
- print_debug(" value 0x");
- print_debug_hex8(pci_read_config8(dev, offset));
- print_debug("\r\n");
+} Index: src/mainboard/via/epia-cn/acpi_tables.c =================================================================== --- src/mainboard/via/epia-cn/acpi_tables.c (revision 0) +++ src/mainboard/via/epia-cn/acpi_tables.c (revision 0) @@ -0,0 +1,108 @@ +/*
- coreboot ACPI Table support
- written by Stefan Reinauer stepan@openbios.org
- ACPI FADT, FACS, and DSDT table support added by
- Nick Barker nick.barker9@btinternet.com, and those portions
- (C) Copyright 2004 Nick Barker
- (C) Copyright 2005 Stefan Reinauer
- */
+#include <console/console.h> +#include <string.h> +#include <arch/acpi.h>
+extern unsigned char AmlCode[];
+unsigned long acpi_fill_madt(unsigned long current) +{
- printk_debug(" * entering apci_fill_madt()\n");
- unsigned int gsi_base=0x18;
- /* create all subtables for processors */
- current += acpi_create_madt_lapic((acpi_madt_lapic_t *)current, 0, 0);
- /* SB IOAPIC */
- current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current,
0x02, 0xfec00000UL, 0);
Again please use the defines from VT8237R as I did.
- /* Write NB IOAPIC */
- current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *)current, 0x3,
0xfecc0000UL, gsi_base);
Same here
- current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
current, 0, 0, 2, 0);
- current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
current, 0, 9, 9, 0xf);
- /* create all subtables for processors */
- current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)current,
0, 5, 1);
- printk_debug(" * leaving acpi_fill_madt()\n");
- return current;
+}
+unsigned long acpi_fill_srat(unsigned long current) +{
- return current;
+}
+unsigned long acpi_fill_mcfg(unsigned long current) +{
- return current;
+}
+unsigned long write_acpi_tables(unsigned long start) +{
- unsigned long current;
- acpi_rsdp_t *rsdp;
- acpi_rsdt_t *rsdt;
- acpi_hpet_t *hpet;
- acpi_madt_t *madt;
- acpi_fadt_t *fadt;
- acpi_facs_t *facs;
- acpi_header_t *dsdt;
- /* Align ACPI tables to 16byte */
- start = ( start + 0x0f ) & -0x10;
- current = start;
- printk_info("ACPI: Writing ACPI tables at %lx...\n", start);
- /* We need at least an RSDP and an RSDT Table */
- rsdp = (acpi_rsdp_t *) current;
- current += sizeof(acpi_rsdp_t);
- rsdt = (acpi_rsdt_t *) current;
- current += sizeof(acpi_rsdt_t);
- /* clear all table memory */
- memset((void *)start, 0, current - start);
- acpi_write_rsdp(rsdp, rsdt);
- acpi_write_rsdt(rsdt);
- rsdp->checksum = acpi_checksum(rsdp, 20);
- printk_debug("ACPI: * FACS\n");
- facs = (acpi_facs_t *) current;
- current += sizeof(acpi_facs_t);
- acpi_create_facs(facs);
- dsdt = (acpi_header_t *) current;
- current += ((acpi_header_t *)AmlCode)->length;
- memcpy((void *)dsdt,(void *)AmlCode, ((acpi_header_t *)AmlCode)->length);
- dsdt->checksum = 0; // don't trust intel iasl compiler to get this right
- dsdt->checksum = acpi_checksum(dsdt, dsdt->length);
- printk_debug("ACPI: * DSDT @ %08x Length %x\n", dsdt, dsdt->length);
- printk_debug("ACPI: * FADT\n");
- fadt = (acpi_fadt_t *) current;
- current += sizeof(acpi_fadt_t);
- acpi_create_fadt(fadt,facs,dsdt);
- acpi_add_table(rsdt,fadt);
- printk_info("ACPI: done.\n");
- return current;
+}
Index: src/mainboard/via/epia-cn/Options.lb
--- src/mainboard/via/epia-cn/Options.lb (revision 0) +++ src/mainboard/via/epia-cn/Options.lb (revision 0) @@ -0,0 +1,151 @@ +uses HAVE_MP_TABLE +uses HAVE_PIRQ_TABLE +uses USE_FALLBACK_IMAGE +uses HAVE_FALLBACK_BOOT +uses HAVE_HARD_RESET +uses HAVE_OPTION_TABLE +uses USE_OPTION_TABLE +uses CONFIG_ROM_PAYLOAD +uses IRQ_SLOT_COUNT +uses MAINBOARD +uses MAINBOARD_VENDOR +uses MAINBOARD_PART_NUMBER +uses COREBOOT_EXTRA_VERSION +uses ARCH +uses FALLBACK_SIZE +uses STACK_SIZE +uses HEAP_SIZE +uses ROM_SIZE +uses ROM_SECTION_SIZE +uses ROM_IMAGE_SIZE +uses ROM_SECTION_SIZE +uses ROM_SECTION_OFFSET +uses CONFIG_ROM_PAYLOAD_START +uses CONFIG_COMPRESSED_PAYLOAD_NRV2B +uses CONFIG_COMPRESSED_PAYLOAD_LZMA +uses PAYLOAD_SIZE +uses _ROMBASE +uses _RAMBASE +uses XIP_ROM_SIZE +uses XIP_ROM_BASE +uses HAVE_MP_TABLE +uses HAVE_ACPI_TABLES +uses CROSS_COMPILE +uses CC +uses HOSTCC +uses OBJCOPY +uses DEFAULT_CONSOLE_LOGLEVEL +uses MAXIMUM_CONSOLE_LOGLEVEL +uses CONFIG_CONSOLE_SERIAL8250 +uses CONFIG_UDELAY_TSC +uses CONFIG_TSC_X86RDTSC_CALIBRATE_WITH_TIMER2 +uses CONFIG_PCI_ROM_RUN +uses CONFIG_CONSOLE_VGA +uses CONFIG_MAX_PCI_BUSES +uses TTYS0_BAUD +uses CONFIG_CHIP_NAME +uses CONFIG_VIDEO_MB +uses CONFIG_IOAPIC
+# default IOAPIC +default CONFIG_IOAPIC = 0
+# default MB size +default CONFIG_VIDEO_MB = 32
+## ROM_SIZE is the size of boot ROM that this board will use. +default ROM_SIZE = 512*1024
+### +### Build options +### +default CONFIG_PCI_ROM_RUN=0 +default CONFIG_CONSOLE_VGA=0
+default CONFIG_CHIP_NAME=1
+## +## Build code for the fallback boot +## +default HAVE_FALLBACK_BOOT=1
+## +## no MP table +## +default HAVE_MP_TABLE=0
+## +## Use TSC for udelay. +## +default CONFIG_UDELAY_TSC=1 +default CONFIG_TSC_X86RDTSC_CALIBRATE_WITH_TIMER2=1
+## +## Build code to reset the motherboard from coreboot +## +default HAVE_HARD_RESET=0
+## +## Build code to export a programmable irq routing table +## +default HAVE_PIRQ_TABLE=1 +default IRQ_SLOT_COUNT=10
+## +## Build code to load acpi tables +## +default HAVE_ACPI_TABLES=1
+## +## Build code to export a CMOS option table +## +default HAVE_OPTION_TABLE=1
+### +### coreboot layout values +###
+## ROM_IMAGE_SIZE is the amount of space to allow coreboot to occupy. +default ROM_IMAGE_SIZE = 128*1024 +default FALLBACK_SIZE = 512*1024
+## +## Use a small 8K stack +## +default STACK_SIZE=0x2000
+## +## Use a small 16K heap +## +default HEAP_SIZE=0x4000
+## +## Only use the option table in a normal image +## +#default USE_OPTION_TABLE = !USE_FALLBACK_IMAGE +default USE_OPTION_TABLE = 0
+default _RAMBASE = 0x00004000
+default CONFIG_ROM_PAYLOAD = 1
+## +## The default compiler +## +default CROSS_COMPILE="" +default CC="$(CROSS_COMPILE)gcc -m32" +default HOSTCC="gcc"
+## +## Set this to the max PCI bus number you +## would ever use for PCI config IO. +## Setting this number very high will make +## pci_locate_device take a long time when +## it can't find a device. +## +default CONFIG_MAX_PCI_BUSES = 5
+end
Index: src/mainboard/via/epia-cn/failover.c
--- src/mainboard/via/epia-cn/failover.c (revision 0) +++ src/mainboard/via/epia-cn/failover.c (revision 0) @@ -0,0 +1,34 @@ +#define ASSEMBLY 1 +#include <stdint.h> +#include <device/pci_def.h> +#include <device/pci_ids.h> +#include <arch/io.h> +#include "arch/romcc_io.h" +#include "pc80/mc146818rtc_early.c"
+static unsigned long main(unsigned long bist) +{ +#if 0
- /* This is the primary cpu how should I boot? */
- if (do_normal_boot()) {
goto normal_image;
- }
- else {
goto fallback_image;
- }
- normal_image:
- asm volatile ("jmp __normal_image"
: /* outputs */
: "a" (bist) /* inputs */
: /* clobbers */
);
- cpu_reset:
- asm volatile ("jmp __cpu_reset"
: /* outputs */
: "a"(bist) /* inputs */
: /* clobbers */
);
- fallback_image:
+#endif
- return bist;
+} Index: src/mainboard/via/epia-cn/chip.h =================================================================== --- src/mainboard/via/epia-cn/chip.h (revision 0) +++ src/mainboard/via/epia-cn/chip.h (revision 0) @@ -0,0 +1,5 @@ +extern struct chip_operations mainboard_via_epia_cn_ops;
+struct mainboard_via_epia_cn_config {
- int nothing;
+}; Index: src/mainboard/via/epia-cn/auto.c =================================================================== --- src/mainboard/via/epia-cn/auto.c (revision 0) +++ src/mainboard/via/epia-cn/auto.c (revision 0) @@ -0,0 +1,185 @@ +/*
- This file is part of the coreboot project.
- Copyright (C) 2008 VIA Technologies, Inc.
- Copyright (C) 2008 Aaron Lwe aaron.lwe@gmail.com
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
+#define ASSEMBLY 1
+#include <stdint.h> +#include <device/pci_def.h> +#include <device/pci_ids.h> +#if 0 +#include <cpu/x86/lapic.h> +#endif +#include <arch/io.h> +#include <device/pnp_def.h> +#include <arch/romcc_io.h> +#include <arch/hlt.h> +#include "pc80/serial.c" +#include "arch/i386/lib/console.c" +#include "ram/ramtest.c" +#include "northbridge/via/cn700/raminit.h" +#include "cpu/x86/mtrr/earlymtrr.c" +#include "cpu/x86/bist.h"
+/*
- */
+void udelay(int usecs) +{
- int i;
- for(i = 0; i < usecs; i++)
outb(i&0xff, 0x80);
+}
+#include "lib/delay.c" +#include "cpu/x86/lapic/boot_cpu.c" +#include "debug.c"
+#include "southbridge/via/vt8237r/vt8237r_early_smbus.c"
+#include "southbridge/via/vt8235/vt8235_early_serial.c" +static void memreset_setup(void) +{ +}
+static inline int spd_read_byte(unsigned device, unsigned address) +{
- return smbus_read_byte(device, address);
+}
+#include "northbridge/via/cn700/raminit.c"
+static void enable_mainboard_devices(void) +{
- device_t dev;
- u8 reg;
/*
- disable sata and move ide device from 00:0f.1 to 00:0f.0
- */
- 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
print_debug("no sata device \r\n");
- dev = pci_locate_device(PCI_ID(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT8237R_LPC), 0);
- if (dev == PCI_DEV_INVALID)
die("Southbridge not found!!!\n");
- pci_write_config8(dev, 0x50, 0x8a); // disable mc97 and ehci
- pci_write_config8(dev, 0x51, 0x9d); // disable USB device mode
Hmm there are some disable enable generic bits, check vt8237r_enable and friends.
+}
+static void enable_shadow_ram(void) +{
- device_t dev = 0x3000; /* dram device */
- unsigned char shadowreg;
- /* dev 0 for southbridge */
- shadowreg = pci_read_config8(dev, 0x83);
- /* 0xf0000-0xfffff */
- shadowreg |= 0x30;
- pci_write_config8(dev, 0x83, shadowreg);
- pci_write_config8(dev, 0x80, 0xff);
- pci_write_config8(dev, 0x81, 0xff);
- pci_write_config8(dev, 0x82, 0xff);
- dev = 0x7000; /* vlink device */
- 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 can be moved to NB code. Check k8t890_ctrl.c
+}
+static const struct mem_controller ctrl = {
- .d0f0 = 0x0000,
- .d0f2 = 0x2000,
- .d0f3 = 0x3000,
- .d0f4 = 0x4000,
- .d0f7 = 0x7000,
- .d1f0 = 0x8000,
- .channel0 = { 0x50 },
+};
+static void main(unsigned long bist) +{
- unsigned long x;
- device_t dev;
- /* multifunction for northbridge */
- pci_write_config8(ctrl.d0f0, 0x4f, 0x01);
- enable_vt8235_serial();
- uart_init();
- console_init();
- print_spew("In auto.c:main()\r\n");
- enable_smbus();
- smbus_fixup(&ctrl);
- if (bist == 0) {
print_debug("doing early_mtrr\r\n");
early_mtrr_init();
- }
- /* Halt if there was a built in self test failure */
- report_bist_failure(bist);
- print_debug(" Enabling mainboard devices\r\n");
- enable_mainboard_devices();
- print_debug(" Enabling shadow ram\r\n");
- enable_shadow_ram();
- ddr_ram_setup(&ctrl);
- /* Check all of memory */
+#if 0
- ram_check(0x0, 0x1000);
+#endif +#if 0
- static const struct {
unsigned long lo, hi;
- } check_addrs[] = {
/* Check 16MB of memory @ 0*/
{ 0x000fff00, 0x001000ff },
+#if TOTAL_CPUS > 1
/* Check 16MB of memory @ 2GB */
{ 0x80000000, 0x81000000 },
+#endif
- };
- int i;
- for(i = 0; i < sizeof(check_addrs)/sizeof(check_addrs[0]); i++) {
ram_check(check_addrs[i].lo, check_addrs[i].hi);
- }
+#endif
- print_spew("Leaving auto.c:main()\r\n");
+} Index: src/mainboard/via/epia-cn/cmos.layout =================================================================== --- src/mainboard/via/epia-cn/cmos.layout (revision 0) +++ src/mainboard/via/epia-cn/cmos.layout (revision 0) @@ -0,0 +1,74 @@ +entries
+#start-bit length config config-ID name +#0 8 r 0 seconds +#8 8 r 0 alarm_seconds +#16 8 r 0 minutes +#24 8 r 0 alarm_minutes +#32 8 r 0 hours +#40 8 r 0 alarm_hours +#48 8 r 0 day_of_week +#56 8 r 0 day_of_month +#64 8 r 0 month +#72 8 r 0 year +#80 4 r 0 rate_select +#84 3 r 0 REF_Clock +#87 1 r 0 UIP +#88 1 r 0 auto_switch_DST +#89 1 r 0 24_hour_mode +#90 1 r 0 binary_values_enable +#91 1 r 0 square-wave_out_enable +#92 1 r 0 update_finished_enable +#93 1 r 0 alarm_interrupt_enable +#94 1 r 0 periodic_interrupt_enable +#95 1 r 0 disable_clock_updates +#96 288 r 0 temporary_filler +0 384 r 0 reserved_memory +384 1 e 4 boot_option +385 1 e 4 last_boot +386 1 e 1 ECC_memory +388 4 r 0 reboot_bits +392 3 e 5 baud_rate +400 1 e 1 power_on_after_fail +412 4 e 6 debug_level +416 4 e 7 boot_first +420 4 e 7 boot_second +424 4 e 7 boot_third +428 4 h 0 boot_index +432 8 h 0 boot_countdown +1008 16 h 0 check_sum
+enumerations
+#ID value text +1 0 Disable +1 1 Enable +2 0 Enable +2 1 Disable +4 0 Fallback +4 1 Normal +5 0 115200 +5 1 57600 +5 2 38400 +5 3 19200 +5 4 9600 +5 5 4800 +5 6 2400 +5 7 1200 +6 6 Notice +6 7 Info +6 8 Debug +6 9 Spew +7 0 Network +7 1 HDD +7 2 Floppy +7 8 Fallback_Network +7 9 Fallback_HDD +7 10 Fallback_Floppy +#7 3 ROM
+checksums
+checksum 392 1007 1008
Index: src/mainboard/via/epia-cn/mainboard.c
--- src/mainboard/via/epia-cn/mainboard.c (revision 0) +++ src/mainboard/via/epia-cn/mainboard.c (revision 0) @@ -0,0 +1,47 @@ +#include <console/console.h> +#include <device/device.h> +#include <device/pci.h> +#include <device/pci_ids.h> +#include <device/pci_ops.h> +#include <arch/io.h> +#include "chip.h"
+void vga_enable_console();
+/* +static void vga_fixup(void) {
// we do this right here because:
// - all the hardware is working, and some VGA bioses seem to need
// that
// - we need page 0 below for linuxbios tables.
printk_debug("INSTALL REAL-MODE IDT\n");
setup_realmode_idt();
printk_debug("DO THE VGA BIOS\n");
do_vgabios();
post_code(0x93);
- vga_enable_console();
+}
+void write_protect_vgabios(void) +{
- device_t dev;
- printk_info("write_protect_vgabios\n");
- // there are two possible devices. Just do both.
- dev = dev_find_device(PCI_VENDOR_ID_VIA, 0x3344, 0);
- if(dev)
pci_write_config8(dev, 0x61, 0xaa);
+// dev = dev_find_device(PCI_VENDOR_ID_VIA, 0x3123, 0);
- // if(dev)
- // pci_write_config8(dev, 0x61, 0xaa);
+} +*/
+struct chip_operations mainboard_via_epia_cn_ops = {
- CHIP_NAME("VIA EPIA-CN Mainboard")
+};
Index: src/northbridge/via/cn700/raminit.c
--- src/northbridge/via/cn700/raminit.c (revision 3300) +++ src/northbridge/via/cn700/raminit.c (working copy) @@ -1,6 +1,8 @@ /*
- This file is part of the coreboot project.
- Copyright (C) 2008 VIA Technologies, Inc.
- Copyright (C) 2008 Aaron Lwe aaron.lwe@gmail.com
- Copyright (C) 2007 Corey Osgood corey.osgood@gmail.com
- This program is free software; you can redistribute it and/or modify
@@ -23,7 +25,7 @@ #include <delay.h> #include "cn700.h"
-//#define DEBUG_RAM_SETUP 1 +#define DEBUG_RAM_SETUP 1
#ifdef DEBUG_RAM_SETUP #define PRINT_DEBUG_MEM(x) print_debug(x) @@ -43,35 +45,18 @@ { u8 reg;
- /* TODO: Support for multiple DIMMs. */
- reg = pci_read_config8(dev, DRAM_MISC_CTL);
- reg = pci_read_config8(dev, 0x6b);
why?
reg &= 0xf8; /* Clear bits 2-0. */ reg |= command;
- pci_write_config8(dev, DRAM_MISC_CTL, reg);
pci_write_config8(dev, 0x6b, reg);
PRINT_DEBUG_MEM(" Sending RAM command 0x"); PRINT_DEBUG_MEM_HEX8(reg); PRINT_DEBUG_MEM(" to 0x"); PRINT_DEBUG_MEM_HEX32(0 + addr_offset); PRINT_DEBUG_MEM("\r\n");
- read32(0 + addr_offset);
}
-/**
- Configure the bus between the cpu and the northbridge. This might be able to
- be moved to post-ram code in the future. For the most part, these registers
- should not be messed around with. These are too complex to explain short of
- copying the datasheets into the comments, but most of these values are from
- the BIOS Porting Guide, so they should work on any board. If they don't,
- try the values from your factory BIOS.
- TODO: Changing the DRAM frequency doesn't work (hard lockup)
- @param dev The northbridge's CPU Host Interface (D0F2)
- */
static void c7_cpu_setup(device_t dev) { /* Host bus interface registers (D0F2 0x50-0x67) */ @@ -82,8 +67,8 @@ pci_write_config8(dev, 0x52, 0x6f); /* Arbitration */ pci_write_config8(dev, 0x53, 0x88);
- /* Miscellaneous Control */
- pci_write_config8(dev, 0x54, 0x10);
- // Miscellaneous Control
- pci_write_config8(dev, 0x54, 0x1e); pci_write_config8(dev, 0x55, 0x16); /* Write Policy */ pci_write_config8(dev, 0x56, 0x01);
@@ -94,8 +79,8 @@ * 100 : 266MHz 101 : 333MHz * 110/111 : Reserved */ //pci_write_config8(dev, 0x57, 0x60);//set 200MHz dram clock
- /* CPU Miscellaneous Control */
- pci_write_config8(dev, 0x59, 0x60);
- // CPU Miscellaneous Control
- pci_write_config8(dev, 0x59, 0x44); /* Write Policy */ pci_write_config8(dev, 0x5d, 0xb2); /* Bandwidth Timer */
@@ -111,18 +96,18 @@ pci_write_config8(dev, 0x63, 0xff); pci_write_config8(dev, 0x64, 0xff); pci_write_config8(dev, 0x65, 0x0f);
- /* Read Line Burst DRDY# Timing Control */
- // Read Line Burst DRDY# Timing Control pci_write_config8(dev, 0x66, 0xff);
- pci_write_config8(dev, 0x67, 0x70);
- pci_write_config8(dev, 0x67, 0x30);
- /* Host Bus IO Circuit (See datasheet) */
- /* Host Address Pullup/down Driving */
- pci_write_config8(dev, 0x70, 0x33);
- pci_write_config8(dev, 0x71, 0x00);
- pci_write_config8(dev, 0x72, 0x33);
- pci_write_config8(dev, 0x73, 0x00);
- /* Miscellaneous Control */
- pci_write_config8(dev, 0x74, 0x00);
- // Host Bus IO Circuit (See datasheet)
- // Host Address Pullup/down Driving
- pci_write_config8(dev, 0x70, 0x11);
- pci_write_config8(dev, 0x71, 0x11);
- pci_write_config8(dev, 0x72, 0x11);
- pci_write_config8(dev, 0x73, 0x11);
- // Miscellaneous Control
- pci_write_config8(dev, 0x74, 0x35); /* AGTL+ I/O Circuit */ pci_write_config8(dev, 0x75, 0x28); /* AGTL+ Compensation Status */
@@ -135,206 +120,286 @@ 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) */
- 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);
}
-/**
- Set up various ram and other control registers statically. Some of these may
- not be needed, other should be done with spd info, but that's a project for
- the future
- */
-static void sdram_set_registers(const struct mem_controller *ctrl) +void sdram_set_size(const struct mem_controller *ctrl) {
- /* DQ/DQS Strength Control */
- pci_write_config8(ctrl->d0f3, 0xd0, 0x88);
- pci_write_config8(ctrl->d0f3, 0xd1, 0x8b);
- pci_write_config8(ctrl->d0f3, 0xd2, 0x89);
- /* SMM and APIC Decoding */
- pci_write_config8(ctrl->d0f3, 0x86, 0x2d);
- /* Driving selection */
- /* DQ / DQS ODT Driving and Range Select */
- pci_write_config8(ctrl->d0f3, 0xd5, 0x8a);
- /* Memory Pads Driving and Range Select */
- pci_write_config8(ctrl->d0f3, 0xd6, 0xaa);
- /* DRAM Driving – Group DQS */
- pci_write_config8(ctrl->d0f3, 0xe0, 0xee);
- /* DRAM Driving – Group DQ (DQ, MPD, DQM) */
- pci_write_config8(ctrl->d0f3, 0xe2, 0xac);//ba
- /* DRAM Driving – Group CS */
- pci_write_config8(ctrl->d0f3, 0xe4, 0x66);
- /* DRAM Driving – Group MA */
- pci_write_config8(ctrl->d0f3, 0xe8, 0x86);
- /* DRAM Driving – Group MCLK */
- pci_write_config8(ctrl->d0f3, 0xe6, 0xaa);
- u8 density, ranks, result, col;
- /* ODT (some are set with driving select above) */
- /* Memory Pad ODT Pullup / Pulldown Control */
- pci_write_config8(ctrl->d0f3, 0xd4, 0x0a);
- /* Memory Ranks ODT Lookup Table */
- pci_write_config8(ctrl->d0f3, 0xd8, 0x00);//was 1
- /* Compensation Control */
- pci_write_config8(ctrl->d0f3, 0xd3, 0x89);//enable auto compensation
- /* MCLKO Phase Control */
- pci_write_config8(ctrl->d0f3, 0x91, 0x02);
- /* CS/CKE Clock Phase Control */
- pci_write_config8(ctrl->d0f3, 0x92, 0x06);
- /* SCMD/MA Clock Phase Control */
- pci_write_config8(ctrl->d0f3, 0x93, 0x07);
- /* Channel A DQS Input Capture Range Control */
- pci_write_config8(ctrl->d0f3, 0x78, 0x83);
- /* DQS Input Capture Range Control */
- /* Set in accordance with the BIOS update note */
- pci_write_config8(ctrl->d0f3, 0x7a, 0x00);
- /* DQS Input Delay Offset Control */
- pci_write_config8(ctrl->d0f3, 0x7c, 0x00);
- /* SDRAM ODT Control */
- pci_write_config8(ctrl->d0f3, 0xda, 0x80);
- /* DQ/DQS CKG Output Delay Control - I */
- pci_write_config8(ctrl->d0f3, 0xdc, 0xff);
- /* DQ/DQS CKG Output Delay Control - II */
- pci_write_config8(ctrl->d0f3, 0xdd, 0xff);
- /* DQS / DQ CKG Duty Cycle Control */
- pci_write_config8(ctrl->d0f3, 0xec, 0x88);
- /* MCLK Output Duty Control */
- pci_write_config8(ctrl->d0f3, 0xee, 0x00);
- pci_write_config8(ctrl->d0f3, 0xed, 0x10);
- /* DQS CKG Input Delay Control */
- pci_write_config8(ctrl->d0f3, 0xef, 0x10);
- ranks = spd_read_byte(ctrl->channel0[0], 5);
- ranks = (ranks & 0x07) + 1;
- density = spd_read_byte(ctrl->channel0[0], 31);
- switch (density)
- {
case 0x80:
result = 0x08; // 512MB / 64MB = 0x08
break;
case 0x40:
result = 0x04;
break;
case 0x20:
result = 0x02;
break;
case 0x10:
result = 0xff; // 16GB
break;
case 0x08:
result = 0xff; // 8GB
break;
case 0x04:
result = 0xff; // 4GB
break;
case 0x02:
result = 0x20; // 2GB
break;
case 0x01:
result = 0x10; // 1GB
break;
- }
- pci_write_config8(ctrl->d0f3, 0x77, 0x9d);
- pci_write_config8(ctrl->d0f3, 0x79, 0x83);
- pci_write_config16(ctrl->d0f3, 0x88, 0x0020);
- pci_write_config8(ctrl->d0f4, 0xa7, 0x80);
- if (result == 0xff)
die("dram module size too big, not supported by cn700\r\n");
- /* VLink Control */
- pci_write_config8(ctrl->d0f7, 0xb0, 0x05);
- pci_write_config8(ctrl->d0f7, 0xb1, 0x01);
- /* Memory base */
- pci_write_config16(ctrl->d1f0, 0x20, 0xfb00);
- /* Memory limit */
- pci_write_config16(ctrl->d1f0, 0x22, 0xfcf0);
- /* Prefetch memory base */
- pci_write_config16(ctrl->d1f0, 0x24, 0xf400);
- /* Prefetch memory limit */
- pci_write_config16(ctrl->d1f0, 0x26, 0xf7f0);
- /* PCI to PCI bridge control */
- pci_write_config16(ctrl->d1f0, 0x3e, 0x0008);
- /* CPU to PCI flow control 1 */
- pci_write_config8(ctrl->d1f0, 0x40, 0x83);
- pci_write_config8(ctrl->d1f0, 0x41, 0xc3);//clear reset error, set to 43
- pci_write_config8(ctrl->d1f0, 0x42, 0xe2);
- pci_write_config8(ctrl->d1f0, 0x43, 0x44);
- pci_write_config8(ctrl->d1f0, 0x44, 0x34);
- pci_write_config8(ctrl->d1f0, 0x45, 0x72);
- pci_write_config8(ctrl->d0f3, 0x40, result);
- pci_write_config8(ctrl->d0f3, 0x48, 0x00);
- if (ranks == 2) {
pci_write_config8(ctrl->d0f3, 0x41, result * ranks);
pci_write_config8(ctrl->d0f3, 0x49, result);
- }
- // size mirror
- pci_write_config8(ctrl->d0f7, 0xe5, (result * ranks) << 2);
- pci_write_config8(ctrl->d0f7, 0x57, (result * ranks) << 2);
- // Low Top Address
- pci_write_config8(ctrl->d0f3, 0x84, 0x00);
- pci_write_config8(ctrl->d0f3, 0x85, (result * ranks) << 2);
- pci_write_config8(ctrl->d0f3, 0x88, (result * ranks) << 2);
- /* Disable cross bank/multi page mode */
- pci_write_config8(ctrl->d0f3, DDR_PAGE_CTL, 0x80);
- pci_write_config8(ctrl->d0f3, DRAM_REFRESH_COUNTER, 0x00);
- // Physical-Virtual Mapping
- if (ranks == 2)
pci_write_config8(ctrl->d0f3, 0x54, 1 << 7 | 0 << 4 | 1 << 3 | 1 << 0);
- if (ranks == 1)
pci_write_config8(ctrl->d0f3, 0x54, 1 << 7 | 0 << 4);
- pci_write_config8(ctrl->d0f3, 0x55, 0x00);
- // virtual rank interleave, disable
- pci_write_config32(ctrl->d0f3, 0x58, 0x00);
- /* Set WR=5 and RFC */
- pci_write_config8(ctrl->d0f3, 0x61, 0xc7);
- /* Set CAS=5 */
- pci_write_config8(ctrl->d0f3, 0x62, 0xaf);
- // MA Map Type
- result = spd_read_byte(ctrl->channel0[0], 17);
- if (result == 8) {
col = spd_read_byte(ctrl->channel0[0], 4);
switch (col)
{
case 10:
pci_write_config8(ctrl->d0f3, 0x50, 0xa0);
break;
case 11:
pci_write_config8(ctrl->d0f3, 0x50, 0xc0);
break;
case 12:
pci_write_config8(ctrl->d0f3, 0x50, 0xe0);
break;
}
- }
- else if (result == 4) {
col = spd_read_byte(ctrl->channel0[0], 4);
switch (col)
{
case 9:
pci_write_config8(ctrl->d0f3, 0x50, 0x00);
break;
case 10:
pci_write_config8(ctrl->d0f3, 0x50, 0x20);
break;
case 11:
pci_write_config8(ctrl->d0f3, 0x50, 0x40);
break;
case 12:
pci_write_config8(ctrl->d0f3, 0x50, 0x60);
break;
}
- }
- pci_write_config8(ctrl->d0f3, 0x51, 0x00);
+}
+void sdram_set_registers(const struct mem_controller *ctrl) +{
- u8 reg;
- // Set WR=5
- pci_write_config8(ctrl->d0f3, 0x61, 0xe0);
- // Set CAS=4
- pci_write_config8(ctrl->d0f3, 0x62, 0xfa);
- // dram timing-3 pci_write_config8(ctrl->d0f3, 0x63, 0xca);
- /* Set to DDR2 sdram, BL=8 (0xc8, 0xc0 for bl=4) */
- pci_write_config8(ctrl->d0f3, 0x6c, 0xc8);
- /* Allow manual dll reset */
- // dram timing-4
- pci_write_config8(ctrl->d0f3, 0x64, 0xcc);
- // DIMM command / Address Selection
- pci_write_config8(ctrl->d0f3, 0x67, 0x00);
- // Disable cross bank/multi page mode
- pci_write_config8(ctrl->d0f3, 0x69, 0x00);
- // disable refresh now
- pci_write_config8(ctrl->d0f3, 0x6a, 0x00);
- // frequency 100MHZ
- pci_write_config8(ctrl->d0f3, 0x90, 0x00);
- pci_write_config8(ctrl->d0f2, 0x57, 0x18);
- // Allow manual dll reset pci_write_config8(ctrl->d0f3, 0x6b, 0x10);
- // MA Map Type
- pci_write_config8(ctrl->d0f3, 0x52, 0x33);
- pci_write_config8(ctrl->d0f3, 0x53, 0x3f);
- pci_write_config8(ctrl->d0f3, 0x6e, 0x89);
- pci_write_config8(ctrl->d0f3, 0x67, 0x50);
- // Set to DDR2 sdram, BL=8 (0xc8, 0xc0 for bl=4)
- pci_write_config8(ctrl->d0f3, 0x6c, 0xc8);
- // DRAM Bus Turn-Around Setting
- pci_write_config8(ctrl->d0f3, 0x60, 0x03);
- // DRAM Arbitration Control
- pci_write_config8(ctrl->d0f3, 0x66, 0x80);
- // DQS Tuning: testing on a couple different boards has shown this is
- // static, or close enough that it can be. Which is good, because the
- // tuning function used too many registers
- // DQS Output Delay for CHannel A
- pci_write_config8(ctrl->d0f3, 0x70, 0x00);
- // MD Output Delay for Channel A
- pci_write_config8(ctrl->d0f3, 0x71, 0x01);
- pci_write_config8(ctrl->d0f3, 0x73, 0x01);
- // dram arbitration timer pci_write_config8(ctrl->d0f3, 0x65, 0xd9);
- // dram signal timing control
- pci_write_config8(ctrl->d0f3, 0x74, 0x01);
- pci_write_config8(ctrl->d0f3, 0x75, 0x01);
- pci_write_config8(ctrl->d0f3, 0x76, 0x06);
- pci_write_config8(ctrl->d0f3, 0x77, 0x92);
- pci_write_config8(ctrl->d0f3, 0x78, 0x83);
- pci_write_config8(ctrl->d0f3, 0x79, 0x83);
- pci_write_config8(ctrl->d0f3, 0x7a, 0x00);
- pci_write_config8(ctrl->d0f3, 0x7b, 0x10);
- // dram clocking control
- pci_write_config8(ctrl->d0f3, 0x91, 0x01);
- // CS/CKE Clock Phase Control
- pci_write_config8(ctrl->d0f3, 0x92, 0x02);
- // SCMD/MA Clock Phase Control
- pci_write_config8(ctrl->d0f3, 0x93, 0x02);
- // DCLKO Feedback Mode Output Control
- pci_write_config8(ctrl->d0f3, 0x94, 0x00);
- pci_write_config8(ctrl->d0f3, 0x9d, 0x0f);
- /* Only enable bank 1, for now */
- /* TODO: Multiple, dynamically controlled bank enables */
- pci_write_config8(ctrl->d0f3, 0x54, 0x80);
- pci_write_config8(ctrl->d0f3, 0x55, 0x00);
- /* Set to 2T, MA Map type 1.
* TODO: Needs to become dynamic */
- pci_write_config16(ctrl->d0f3, 0x50, 0x0020);
- // SDRAM ODT Control
- pci_write_config8(ctrl->d0f3, 0xda, 0x80);
- // Channel A DQ/DQS CKG Output Delay Control
- pci_write_config8(ctrl->d0f3, 0xdc, 0x54);
- // Channel A DQ/DQS CKG Output Delay Control
- pci_write_config8(ctrl->d0f3, 0xdd, 0x55);
- // odt lookup table
- pci_write_config8(ctrl->d0f3, 0xd8, 0x01);
- pci_write_config8(ctrl->d0f3, 0xd9, 0x0a);
- /* BA0-2 Selection. Don't mess with */
- pci_write_config8(ctrl->d0f3, 0x52, 0x33);
- pci_write_config8(ctrl->d0f3, 0x53, 0x3f);
- // ddr sdram control
- pci_write_config8(ctrl->d0f3, 0x6d, 0xc0);
- pci_write_config8(ctrl->d0f3, 0x6f, 0x41);
- // DQ/DQS Strength Control
- pci_write_config8(ctrl->d0f3, 0xd0, 0xaa);
- // Compensation Control
- pci_write_config8(ctrl->d0f3, 0xd3, 0x01);//enable auto compensation
- // ODT (some are set with driving select above)
- pci_write_config8(ctrl->d0f3, 0xd4, 0x80);
- pci_write_config8(ctrl->d0f3, 0xd5, 0x8a);
- // Memory Pads Driving and Range Select
- pci_write_config8(ctrl->d0f3, 0xd6, 0xaa);
- pci_write_config8(ctrl->d0f3, 0xe0, 0xee);
- pci_write_config8(ctrl->d0f3, 0xe2, 0xac);
- pci_write_config8(ctrl->d0f3, 0xe4, 0x66);
- pci_write_config8(ctrl->d0f3, 0xe6, 0x33);
- pci_write_config8(ctrl->d0f3, 0xe8, 0x86);
- // DQS / DQ CKG Duty Cycle Control
- pci_write_config8(ctrl->d0f3, 0xec, 0x00);
- // MCLK Output Duty Control
- pci_write_config8(ctrl->d0f3, 0xee, 0x00);
- // DQS CKG Input Delay Control
- pci_write_config8(ctrl->d0f3, 0xef, 0x10);
- /* Disable bank interleaving. This feature seems useless anyways */
- pci_write_config32(ctrl->d0f3, 0x58, 0x00000000);
- pci_write_config8(ctrl->d0f3, 0x88, 0x08);
- // dram duty control
- pci_write_config8(ctrl->d0f3, 0xed, 0x10);
- /* Some DQS control stuffs */
- pci_write_config8(ctrl->d0f3, 0x74, 0x04);
- pci_write_config8(ctrl->d0f3, 0x75, 0x04);
- pci_write_config8(ctrl->d0f3, 0x76, 0x00);
- // SMM and APIC deocoding
- pci_write_config8(ctrl->d0f3, 0x86, 0x29);
- // SMM and APIC decoding mirror
- pci_write_config8(ctrl->d0f7, 0xe6, 0x29);
- // dram module configuration
- pci_write_config8(ctrl->d0f3, 0x6e, 0x89);
}
-/**
- Set up dram size according to spd data. Eventually, DRAM timings should be
- done in a similar manner.
- @param ctrl The northbridge devices and spd addresses.
- */
-static void sdram_set_spd_registers(const struct mem_controller *ctrl) +void sdram_set_post(const struct mem_controller *ctrl) {
- u8 spd_data, spd_data2;
- device_t dev = ctrl->d0f3;
- /* Enable multipage mode. */
- pci_write_config8(dev, 0x69, 0x03);
- /* Enable refresh. */
- pci_write_config8(dev, 0x6a, 0x32);
- // vga device
- pci_write_config16(dev, 0xa0, (1 <<15));
- pci_write_config16(dev, 0xa4, 0x0010);
- /* DRAM Bank Size */
- spd_data = spd_read_byte(ctrl->channel0[0],
SPD_DENSITY_OF_EACH_ROW_ON_MODULE);
- /* I know this seems weird. Blame JEDEC/Via. */
- if(spd_data >= 0x10)
spd_data = spd_data >> 1;
- else
spd_data = spd_data << 1;
- /* Check for double sided dimm and adjust size accordingly */
- spd_data2 = spd_read_byte(ctrl->channel0[0], SPD_NUM_BANKS_PER_SDRAM);
- /* There should be 4 banks on a single sided dimm,
* or 8 on a dual sided one */
- spd_data = spd_data * (spd_data2 / 4);
- pci_write_config8(ctrl->d0f3, 0x40, spd_data);
- /* TODO: The rest of the DIMMs */
}
-static void sdram_enable(device_t dev) +static void sdram_enable(device_t dev, unsigned long rank_address) {
- int i;
u8 i;
/* 1. Apply NOP. */ PRINT_DEBUG_MEM("RAM Enable 1: Apply NOP\r\n");
- do_ram_command(dev, RAM_COMMAND_NOP, 0);
- udelay(200);
do_ram_command(dev, RAM_COMMAND_NOP, 0x100);
udelay(100);
read32(rank_address + 0x10);
/* 2. Precharge all. */
udelay(400); PRINT_DEBUG_MEM("RAM Enable 2: Precharge all\r\n");
- do_ram_command(dev, RAM_COMMAND_PRECHARGE, 0);
do_ram_command(dev, RAM_COMMAND_PRECHARGE, 0x200);
read32(rank_address + 0x10);
/* 3. Mode register set. */ PRINT_DEBUG_MEM("RAM Enable 4: Mode register set\r\n");
- do_ram_command(dev, RAM_COMMAND_MRS, 0x2000);//enable dll
- do_ram_command(dev, RAM_COMMAND_MRS, 0x800);//reset dll
do_ram_command(dev, RAM_COMMAND_MRS, 0x120020);//enable dll
read32(rank_address + 0x120000);
read32(rank_address + 0x800);
/* 4. Precharge all again. */ PRINT_DEBUG_MEM("RAM Enable 2: Precharge all\r\n");
- do_ram_command(dev, RAM_COMMAND_PRECHARGE, 0);
do_ram_command(dev, RAM_COMMAND_PRECHARGE, 0x300);
read32(rank_address + 0x0);
/* 5. Perform 8 refresh cycles. Wait tRC each time. */ PRINT_DEBUG_MEM("RAM Enable 3: CBR\r\n");
- do_ram_command(dev, RAM_COMMAND_CBR, 0);
- do_ram_command(dev, RAM_COMMAND_CBR, 0x400); /* First read is actually done by do_ram_command */
- for(i = 0; i < 7; i++) {
- for(i = 0; i < 8; i++) {
udelay(100);read32(rank_address + 0x20);
read32(0);
}
/* 6. Mode register set. */
@@ -343,31 +408,51 @@ /* (E)MRS values are from the BPG. No direct explanation is given, but * they should somehow conform to the JEDEC DDR2 SDRAM Specification * (JESD79-2C). */
- do_ram_command(dev, RAM_COMMAND_MRS, 0x0022d8);
- do_ram_command(dev, RAM_COMMAND_MRS, 0x0011d8);
- read32(rank_address + 0x002258);
- read32(rank_address + 0x121c20);
- read32(rank_address + 0x120020);
- /* 7. Mode register set. */
- PRINT_DEBUG_MEM("RAM Enable 4: Mode register set\r\n");
- do_ram_command(dev, RAM_COMMAND_MRS, 0x21c20);//default OCD calibration
- do_ram_command(dev, RAM_COMMAND_MRS, 0x20020);//exit calibration mode
- /* 8. Normal operation */ PRINT_DEBUG_MEM("RAM Enable 5: Normal operation\r\n"); do_ram_command(dev, RAM_COMMAND_NORMAL, 0);
- /* Enable multipage mode. */
- pci_write_config8(dev, DDR_PAGE_CTL, 0x83);
- /* Enable refresh. */
- pci_write_config8(dev, DRAM_REFRESH_COUNTER, 0x32);
- /* DQS Tuning: testing on a couple different boards has shown this is
* static, or close enough that it can be. Which is good, because the
* tuning function used too many registers. */
- pci_write_config8(dev, CH_A_DQS_OUTPUT_DELAY, 0x00);
- pci_write_config8(dev, CH_A_MD_OUTPUT_DELAY, 0x03);
- read32(rank_address + 0x30);
+}
- /* Enable VGA device with no memory, add memory later. We need this
* here to enable the actual device, otherwise it won't show up until
* later and LB will have a fit. */
- pci_write_config16(dev, 0xa0, (1 << 15));
- pci_write_config16(dev, 0xa4, 0x0010);
+void dumpnorth(void) +{
- u16 i, j;
- device_t dev;
- for (dev = PCI_DEV(0, 0, 0); dev <= PCI_DEV(0, 1, 0); dev += PCI_DEV(0, 0, 1)) {
if (dev == PCI_DEV(0, 0, 5) || dev == PCI_DEV(0, 0, 6))
continue;
print_debug("dumping device ");
print_debug_hex32(dev);
print_debug("\r\n");
for (i = 0; i < 0xFF; i += 0x10) {
print_debug_hex8(i);
print_debug(": ");
for (j = 0; j < 0x10; j++) {
print_debug_hex8(pci_read_config8(dev, i + j));
print_debug(" ");
}
print_debug("\r\n");
}
- }
}
+void ddr_ram_setup(const struct mem_controller *ctrl) +{
- u8 reg;
- c7_cpu_setup(ctrl->d0f2);
- sdram_set_registers(ctrl);
- sdram_set_size(ctrl);
- sdram_enable(ctrl->d0f3, 0);
- reg = pci_read_config8(ctrl->d0f3, 0x41);
- if (reg != 0)
sdram_enable(ctrl->d0f3, pci_read_config8(ctrl->d0f3, 0x40) << 26);
- sdram_set_post(ctrl);
- dumpnorth();
+}
Index: src/northbridge/via/cn700/northbridge.c
--- src/northbridge/via/cn700/northbridge.c (revision 3300) +++ 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.
- Copyright (C) 2008 Aaron Lwe aaron.lwe@gmail.com
- 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,7 +46,23 @@ /* 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);
- // subsystem id?
- pci_write_config16(dev, 0xb2, 0x5aaa);
- // dunno
- pci_write_config8(dev, 0xb4, 0x0f);
- // AGPCINT Misc. pci_write_config8(dev, 0xb8, 0x08);
}
@@ -124,7 +141,7 @@
static void pci_domain_set_resources(device_t dev) {
- static const u8 ramregs[] = {0x40, 0x41, 0x42, 0x43};
- static const u8 ramregs[] = {0x43, 0x42, 0x41, 0x40}; device_t mc_dev; u32 pci_tolm;
@@ -133,7 +150,7 @@ pci_tolm = find_pci_tolm(&dev->link[0]); mc_dev = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_CN700_MEMCTRL, 0);
- if (mc_dev) { unsigned long tomk, tolmk; unsigned char rambits;
@@ -141,11 +158,13 @@
for(rambits = 0, i = 0; i < ARRAY_SIZE(ramregs); i++) { unsigned char reg;
reg = pci_read_config8(mc_dev, ramregs[i]);
rambits += reg;
rambits = pci_read_config8(mc_dev, ramregs[i]);
if (rambits != 0)
}break;
tomk = rambits;
tomk = rambits * 64 * 1024;
/* Compute the Top Of Low Memory, in Kb */ tolmk = pci_tolm >> 10; if (tolmk >= tomk) {printk_spew("tomk is 0x%x\n", tomk);
@@ -156,9 +175,8 @@ idx = 10; /* TODO: Hole needed? */ ram_resource(dev, idx++, 0, 640); /* first 640k */
/* Leave a hole for vga */
ram_resource(dev, idx++, 768, (tolmk - 768 -
(CONFIG_VIDEO_MB * 1024)));
/* Leave a hole for vga, 0xa0000 - 0xc0000 */
} assign_resources(&dev->link[0]);ram_resource(dev, idx++, 768, (tolmk - 768 - CONFIG_VIDEO_MB * 1024));
} Index: targets/via/epia-cn/Config.lb =================================================================== --- targets/via/epia-cn/Config.lb (revision 0) +++ targets/via/epia-cn/Config.lb (revision 0) @@ -0,0 +1,45 @@ +# Sample config file for EPIA-CN +# This will make a target directory of ./epia-CN
+target via_epia_cn
+mainboard via/epia-cn
+option MAXIMUM_CONSOLE_LOGLEVEL=8 +option DEFAULT_CONSOLE_LOGLEVEL=8 +option CONFIG_CONSOLE_SERIAL8250=1 +# +# generate the final rom like this: cat vgabios bochsbios coreboot.rom > coreboot.rom.final +# +option ROM_SIZE=512*1024 - 64 * 1024 - 64 * 1024
+option HAVE_OPTION_TABLE=1 +option CONFIG_ROM_PAYLOAD=1 +option HAVE_FALLBACK_BOOT=1
+### +### Compute the location and size of where this firmware image +### (coreboot plus bootloader) will live in the boot rom chip. +### +option FALLBACK_SIZE=ROM_SIZE
+## coreboot C code runs at this location in RAM +option _RAMBASE=0x00004000
+# +### +### Compute the start location and size size of +### The coreboot bootloader. +###
+# +# EPIA-CN +# +romimage "fallback"
- option USE_FALLBACK_IMAGE=1
- option ROM_IMAGE_SIZE=0x20000
- option COREBOOT_EXTRA_VERSION=".0Fallback"
- payload $(HOME)/src/filo-0.5/filo.elf
+end
+buildrom ./coreboot.rom ROM_SIZE "fallback"
Acked-by: Bari Ari bari@onelabs.com "without the ACPI stuff" - cdh
This is a working patch for epia-cn which uses C7 + CN700 + VT8237R. Signed-off-by: Aaron Lwe aaron.lwe@gmail.com
-Aaron
aaron lwe wrote:
Hi,
This is a working patch for epia-cn which uses C7 + CN700 + VT8237R. Signed-off-by: Aaron Lwe aaron.lwe@gmail.com
-Aaron
I was able to test the patch without video.
Awardeco was not able to pull the videobios out of the bios image. Is the videobios binary available somewhere?
-Bari
Awardeco was not able to pull the videobios out of the bios image. Is the videobios binary available somewhere?
See http://www.coreboot.org/VGA_support, you can extract vgabios under linux when booted with factory bios.
-Aaron
On Tue, 13 May 2008 22:32:26 -0500, bari bari@onelabs.com wrote:
aaron lwe wrote:
Hi,
This is a working patch for epia-cn which uses C7 + CN700 + VT8237R. Signed-off-by: Aaron Lwe aaron.lwe@gmail.com
-Aaron
I was able to test the patch without video.
Awardeco was not able to pull the videobios out of the bios image. Is the videobios binary available somewhere?
Have you tried the dd method? http://www.coreboot.org/VGA_support