epia-m support
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1655 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
@ -3,6 +3,10 @@
|
|||||||
* written by Stefan Reinauer <stepan@openbios.org>
|
* written by Stefan Reinauer <stepan@openbios.org>
|
||||||
* (C) 2004 SUSE LINUX AG
|
* (C) 2004 SUSE LINUX AG
|
||||||
*/
|
*/
|
||||||
|
/* ACPI FADT, FACS, and DSDT table support added by
|
||||||
|
* Nick Barker <nick.barker9@btinternet.com>, and those portions
|
||||||
|
* (C) Copyright 2004 Nick Barker
|
||||||
|
*/
|
||||||
|
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -22,7 +26,15 @@
|
|||||||
#define OEM_ID "LXBIOS"
|
#define OEM_ID "LXBIOS"
|
||||||
#define ASLC "NONE"
|
#define ASLC "NONE"
|
||||||
|
|
||||||
static u8 acpi_checksum(u8 *table, u32 length)
|
|
||||||
|
// FIX ME - define needs declaring / setting in Config files
|
||||||
|
#define HAVE_ACPI_FADT
|
||||||
|
|
||||||
|
#ifdef HAVE_ACPI_FADT
|
||||||
|
extern unsigned char AmlCode[];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
u8 acpi_checksum(u8 *table, u32 length)
|
||||||
{
|
{
|
||||||
u8 ret=0;
|
u8 ret=0;
|
||||||
while (length--) {
|
while (length--) {
|
||||||
@ -43,13 +55,15 @@ static void acpi_add_table(acpi_rsdt_t *rsdt, void *table)
|
|||||||
for (i=0; i<8; i++) {
|
for (i=0; i<8; i++) {
|
||||||
if(rsdt->entry[i]==0) {
|
if(rsdt->entry[i]==0) {
|
||||||
rsdt->entry[i]=(u32)table;
|
rsdt->entry[i]=(u32)table;
|
||||||
|
/* fix length to stop kernel winging about invalid entries */
|
||||||
|
rsdt->header.length = sizeof(acpi_header_t) + (sizeof(u32) * (i+1));
|
||||||
/* fix checksum */
|
/* fix checksum */
|
||||||
/* hope this won't get optimized away */
|
/* hope this won't get optimized away */
|
||||||
rsdt->header.checksum=0;
|
rsdt->header.checksum=0;
|
||||||
rsdt->header.checksum=acpi_checksum((u8 *)rsdt,
|
rsdt->header.checksum=acpi_checksum((u8 *)rsdt,
|
||||||
rsdt->header.length);
|
rsdt->header.length);
|
||||||
|
|
||||||
printk_debug("ACPI: added table %d/8\n",i+1);
|
printk_debug("ACPI: added table %d/8 Length now %d\n",i+1,rsdt->header.length);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,6 +195,22 @@ static void acpi_create_hpet(acpi_hpet_t *hpet)
|
|||||||
header->checksum = acpi_checksum((void *)hpet, sizeof(acpi_hpet_t));
|
header->checksum = acpi_checksum((void *)hpet, sizeof(acpi_hpet_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void acpi_create_facs(acpi_facs_t *facs)
|
||||||
|
{
|
||||||
|
|
||||||
|
memset( (void *)facs,0, sizeof(acpi_facs_t));
|
||||||
|
|
||||||
|
memcpy(facs->signature,"FACS",4);
|
||||||
|
facs->length = sizeof(acpi_facs_t);
|
||||||
|
facs->hardware_signature = 0;
|
||||||
|
facs->firmware_waking_vector = 0;
|
||||||
|
facs->global_lock = 0;
|
||||||
|
facs->flags = 0;
|
||||||
|
facs->x_firmware_waking_vector_l = 0;
|
||||||
|
facs->x_firmware_waking_vector_h = 0;
|
||||||
|
facs->version = 1;
|
||||||
|
|
||||||
|
}
|
||||||
static void acpi_write_rsdt(acpi_rsdt_t *rsdt)
|
static void acpi_write_rsdt(acpi_rsdt_t *rsdt)
|
||||||
{
|
{
|
||||||
acpi_header_t *header=&(rsdt->header);
|
acpi_header_t *header=&(rsdt->header);
|
||||||
@ -222,6 +252,9 @@ unsigned long write_acpi_tables(unsigned long start)
|
|||||||
acpi_rsdt_t *rsdt;
|
acpi_rsdt_t *rsdt;
|
||||||
acpi_hpet_t *hpet;
|
acpi_hpet_t *hpet;
|
||||||
acpi_madt_t *madt;
|
acpi_madt_t *madt;
|
||||||
|
acpi_fadt_t *fadt;
|
||||||
|
acpi_facs_t *facs;
|
||||||
|
acpi_header_t *dsdt;
|
||||||
|
|
||||||
/* Align ACPI tables to 16byte */
|
/* Align ACPI tables to 16byte */
|
||||||
start = ( start + 0x0f ) & -0x10;
|
start = ( start + 0x0f ) & -0x10;
|
||||||
@ -244,7 +277,6 @@ unsigned long write_acpi_tables(unsigned long start)
|
|||||||
/*
|
/*
|
||||||
* We explicitly add these tables later on:
|
* We explicitly add these tables later on:
|
||||||
*/
|
*/
|
||||||
#define HAVE_ACPI_HPET
|
|
||||||
#ifdef HAVE_ACPI_HPET
|
#ifdef HAVE_ACPI_HPET
|
||||||
printk_debug("ACPI: * HPET\n");
|
printk_debug("ACPI: * HPET\n");
|
||||||
|
|
||||||
@ -263,6 +295,35 @@ unsigned long write_acpi_tables(unsigned long start)
|
|||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_ACPI_FADT
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
printk_info("ACPI: done.\n");
|
printk_info("ACPI: done.\n");
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
@ -60,8 +60,13 @@ struct lb_memory *write_tables(struct mem_range *mem, unsigned long *processor_m
|
|||||||
low_table_end = write_smp_table(low_table_end, processor_map);
|
low_table_end = write_smp_table(low_table_end, processor_map);
|
||||||
|
|
||||||
/* Write ACPI tables */
|
/* Write ACPI tables */
|
||||||
low_table_end = write_acpi_tables(low_table_end);
|
/* write them in the rom area because DSDT can be large (8K on epia-m) which
|
||||||
|
* pushes linuxbios table out of first 4K if set up in low table area
|
||||||
|
*/
|
||||||
|
|
||||||
|
rom_table_end = write_acpi_tables(rom_table_end);
|
||||||
|
rom_table_end = (rom_table_end+1023) & ~1023;
|
||||||
|
|
||||||
/* Don't write anything in the traditional x86 BIOS data segment */
|
/* Don't write anything in the traditional x86 BIOS data segment */
|
||||||
if (low_table_end < 0x500) {
|
if (low_table_end < 0x500) {
|
||||||
low_table_end = 0x500;
|
low_table_end = 0x500;
|
||||||
|
@ -7,6 +7,9 @@
|
|||||||
* The ACPI table structs are based on the Linux kernel sources.
|
* The ACPI table structs are based on the Linux kernel sources.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
/* ACPI FADT & FACS added by Nick Barker <nick.barker9@btinternet.com>
|
||||||
|
* those parts (C) 2004 Nick Barker
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __ASM_ACPI_H
|
#ifndef __ASM_ACPI_H
|
||||||
@ -134,7 +137,77 @@ typedef struct acpi_madt_irqoverride {
|
|||||||
} __attribute__ ((packed)) acpi_madt_irqoverride_t;
|
} __attribute__ ((packed)) acpi_madt_irqoverride_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct acpi_fadt {
|
||||||
|
struct acpi_table_header header;
|
||||||
|
u32 firmware_ctrl;
|
||||||
|
u32 dsdt;
|
||||||
|
u8 res1;
|
||||||
|
u8 preferred_pm_profile;
|
||||||
|
u16 sci_int;
|
||||||
|
u32 smi_cmd;
|
||||||
|
u8 acpi_enable;
|
||||||
|
u8 acpi_disable;
|
||||||
|
u8 s4bios_req;
|
||||||
|
u8 pstate_cnt;
|
||||||
|
u32 pm1a_evt_blk;
|
||||||
|
u32 pm1b_evt_blk;
|
||||||
|
u32 pm1a_cnt_blk;
|
||||||
|
u32 pm1b_cnt_blk;
|
||||||
|
u32 pm2_cnt_blk;
|
||||||
|
u32 pm_tmr_blk;
|
||||||
|
u32 gpe0_blk;
|
||||||
|
u32 gpe1_blk;
|
||||||
|
u8 pm1_evt_len;
|
||||||
|
u8 pm1_cnt_len;
|
||||||
|
u8 pm2_cnt_len;
|
||||||
|
u8 pm_tmr_len;
|
||||||
|
u8 gpe0_blk_len;
|
||||||
|
u8 gpe1_blk_len;
|
||||||
|
u8 gpe1_base;
|
||||||
|
u8 cst_cnt;
|
||||||
|
u16 p_lvl2_lat;
|
||||||
|
u16 p_lvl3_lat;
|
||||||
|
u16 flush_size;
|
||||||
|
u16 flush_stride;
|
||||||
|
u8 duty_offset;
|
||||||
|
u8 duty_width;
|
||||||
|
u8 day_alrm;
|
||||||
|
u8 mon_alrm;
|
||||||
|
u8 century;
|
||||||
|
u16 iapc_boot_arch;
|
||||||
|
u8 res2;
|
||||||
|
u32 flags;
|
||||||
|
struct acpi_gen_regaddr reset_reg;
|
||||||
|
u8 reset_value;
|
||||||
|
u8 res3;
|
||||||
|
u8 res4;
|
||||||
|
u8 res5;
|
||||||
|
u32 x_firmware_ctl_l;
|
||||||
|
u32 x_firmware_ctl_h;
|
||||||
|
u32 x_dsdt_l;
|
||||||
|
u32 x_dsdt_h;
|
||||||
|
struct acpi_gen_regaddr x_pm1a_evt_blk;
|
||||||
|
struct acpi_gen_regaddr x_pm1b_evt_blk;
|
||||||
|
struct acpi_gen_regaddr x_pm1a_cnt_blk;
|
||||||
|
struct acpi_gen_regaddr x_pm1b_cnt_blk;
|
||||||
|
struct acpi_gen_regaddr x_pm2_cnt_blk;
|
||||||
|
struct acpi_gen_regaddr x_pm_tmr_blk;
|
||||||
|
struct acpi_gen_regaddr x_gpe0_blk;
|
||||||
|
struct acpi_gen_regaddr x_gpe1_blk;
|
||||||
|
} __attribute__ ((packed)) acpi_fadt_t;
|
||||||
|
|
||||||
|
typedef struct acpi_facs {
|
||||||
|
char signature[4];
|
||||||
|
u32 length;
|
||||||
|
u32 hardware_signature;
|
||||||
|
u32 firmware_waking_vector;
|
||||||
|
u32 global_lock;
|
||||||
|
u32 flags;
|
||||||
|
u32 x_firmware_waking_vector_l;
|
||||||
|
u32 x_firmware_waking_vector_h;
|
||||||
|
u8 version;
|
||||||
|
u8 resv[33];
|
||||||
|
} __attribute__ ((packed)) acpi_facs_t;
|
||||||
|
|
||||||
|
|
||||||
unsigned long write_acpi_tables(unsigned long addr);
|
unsigned long write_acpi_tables(unsigned long addr);
|
||||||
|
@ -116,7 +116,7 @@ gdt:
|
|||||||
.word 0x0000, 0x0000 /* dummy */
|
.word 0x0000, 0x0000 /* dummy */
|
||||||
.byte 0x00, 0x00, 0x00, 0x00
|
.byte 0x00, 0x00, 0x00, 0x00
|
||||||
|
|
||||||
#if defined(CONFIG_VGABIOS) && (CONFIG_VGABIOS == 1)
|
#if defined(CONFIG_LEGACY_VGABIOS) && (CONFIG_LEGACY_VGABIOS == 1)
|
||||||
// from monty:
|
// from monty:
|
||||||
/* 0x00009a00,0000ffffULL, 20h: 16-bit 64k code at 0x00000000 */
|
/* 0x00009a00,0000ffffULL, 20h: 16-bit 64k code at 0x00000000 */
|
||||||
/* 0x00009200,0000ffffULL 28h: 16-bit 64k data at 0x00000000 */
|
/* 0x00009200,0000ffffULL 28h: 16-bit 64k data at 0x00000000 */
|
||||||
|
@ -481,7 +481,11 @@ define CONFIG_LEGACY_VGABIOS
|
|||||||
export used
|
export used
|
||||||
comment "Support for legacy VGA BIOS"
|
comment "Support for legacy VGA BIOS"
|
||||||
end
|
end
|
||||||
|
define VGABIOS_START
|
||||||
|
default 0
|
||||||
|
export used
|
||||||
|
comment "Base of Legacy VGA in Rom"
|
||||||
|
end
|
||||||
###############################################
|
###############################################
|
||||||
# SMP options
|
# SMP options
|
||||||
###############################################
|
###############################################
|
||||||
|
@ -45,6 +45,7 @@ static unsigned int mtrr_msr[] = {
|
|||||||
MTRRfix4K_E0000_MSR, MTRRfix4K_E8000_MSR, MTRRfix4K_F0000_MSR, MTRRfix4K_F8000_MSR,
|
MTRRfix4K_E0000_MSR, MTRRfix4K_E8000_MSR, MTRRfix4K_F0000_MSR, MTRRfix4K_F8000_MSR,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int mtrr_count = 0;
|
||||||
|
|
||||||
static void intel_enable_fixed_mtrr(void)
|
static void intel_enable_fixed_mtrr(void)
|
||||||
{
|
{
|
||||||
@ -79,6 +80,12 @@ static inline void disable_cache(void)
|
|||||||
::"memory");
|
::"memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void wbinvd(void)
|
||||||
|
{
|
||||||
|
asm volatile (
|
||||||
|
"wbinvd\n\t");
|
||||||
|
}
|
||||||
|
|
||||||
static inline void enable_cache(void)
|
static inline void enable_cache(void)
|
||||||
{
|
{
|
||||||
unsigned int tmp;
|
unsigned int tmp;
|
||||||
@ -92,15 +99,19 @@ static inline void enable_cache(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* setting variable mtrr, comes from linux kernel source */
|
/* setting variable mtrr, comes from linux kernel source */
|
||||||
|
/* funtion nows saves and restores state of deftype regs so that extra mtrr's can be set-up
|
||||||
|
* after the initial main memory mtrr's
|
||||||
|
*/
|
||||||
static void intel_set_var_mtrr(unsigned int reg, unsigned long basek, unsigned long sizek, unsigned char type)
|
static void intel_set_var_mtrr(unsigned int reg, unsigned long basek, unsigned long sizek, unsigned char type)
|
||||||
{
|
{
|
||||||
msr_t base, mask;
|
msr_t base, mask, def,defsave;
|
||||||
|
|
||||||
base.hi = basek >> 22;
|
base.hi = basek >> 22;
|
||||||
base.lo = basek << 10;
|
base.lo = basek << 10;
|
||||||
|
|
||||||
//printk_debug("ADDRESS_MASK_HIGH=%#x\n", ADDRESS_MASK_HIGH);
|
//printk_debug("ADDRESS_MASK_HIGH=%#x\n", ADDRESS_MASK_HIGH);
|
||||||
|
|
||||||
|
printk_debug("Adding mtrr #%d at %08x size %x\n",reg,base.lo,sizek<<10);
|
||||||
if (sizek < 4*1024*1024) {
|
if (sizek < 4*1024*1024) {
|
||||||
mask.hi = ADDRESS_MASK_HIGH;
|
mask.hi = ADDRESS_MASK_HIGH;
|
||||||
mask.lo = ~((sizek << 10) -1);
|
mask.lo = ~((sizek << 10) -1);
|
||||||
@ -116,6 +127,10 @@ static void intel_set_var_mtrr(unsigned int reg, unsigned long basek, unsigned l
|
|||||||
// it is recommended that we disable and enable cache when we
|
// it is recommended that we disable and enable cache when we
|
||||||
// do this.
|
// do this.
|
||||||
disable_cache();
|
disable_cache();
|
||||||
|
def = defsave = rdmsr(MTRRdefType_MSR);
|
||||||
|
def.lo &= 0xf300;
|
||||||
|
wrmsr(MTRRdefType_MSR,def);
|
||||||
|
|
||||||
if (sizek == 0) {
|
if (sizek == 0) {
|
||||||
msr_t zero;
|
msr_t zero;
|
||||||
zero.lo = zero.hi = 0;
|
zero.lo = zero.hi = 0;
|
||||||
@ -129,6 +144,8 @@ static void intel_set_var_mtrr(unsigned int reg, unsigned long basek, unsigned l
|
|||||||
wrmsr (MTRRphysBase_MSR(reg), base);
|
wrmsr (MTRRphysBase_MSR(reg), base);
|
||||||
wrmsr (MTRRphysMask_MSR(reg), mask);
|
wrmsr (MTRRphysMask_MSR(reg), mask);
|
||||||
}
|
}
|
||||||
|
wbinvd();
|
||||||
|
wrmsr(MTRRdefType_MSR,defsave);
|
||||||
enable_cache();
|
enable_cache();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,7 +279,16 @@ static unsigned fixed_mtrr_index(unsigned long addrk)
|
|||||||
}
|
}
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
// Externally visible function to add extra non system memory based mtrr's such
|
||||||
|
// as AGP mtrr's - needs to be called after setup_mtrrs
|
||||||
|
|
||||||
|
void add_var_mtrr(unsigned long range_startk, unsigned long range_sizek,
|
||||||
|
unsigned char type)
|
||||||
|
{
|
||||||
|
intel_set_var_mtrr(mtrr_count++,range_startk,range_sizek,type);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned int range_to_mtrr(unsigned int reg,
|
static unsigned int range_to_mtrr(unsigned int reg,
|
||||||
unsigned long range_startk, unsigned long range_sizek,
|
unsigned long range_startk, unsigned long range_sizek,
|
||||||
unsigned long next_range_startk)
|
unsigned long next_range_startk)
|
||||||
@ -382,6 +408,7 @@ void setup_mtrrs(struct mem_range *mem)
|
|||||||
}
|
}
|
||||||
/* Write the last range */
|
/* Write the last range */
|
||||||
reg = range_to_mtrr(reg, range_startk, range_sizek, 0);
|
reg = range_to_mtrr(reg, range_startk, range_sizek, 0);
|
||||||
|
mtrr_count = reg;
|
||||||
printk_debug("DONE variable MTRRs\n");
|
printk_debug("DONE variable MTRRs\n");
|
||||||
printk_debug("Clear out the extra MTRR's\n");
|
printk_debug("Clear out the extra MTRR's\n");
|
||||||
/* Clear out the extra MTRR's */
|
/* Clear out the extra MTRR's */
|
||||||
|
@ -679,6 +679,10 @@ unsigned int pci_scan_bus(struct bus *bus, unsigned min_devfn,
|
|||||||
/* if a child provides scan_bus(), for example a bridge, scan
|
/* if a child provides scan_bus(), for example a bridge, scan
|
||||||
* buses behind that child */
|
* buses behind that child */
|
||||||
for (child = bus->children; child; child = child->sibling) {
|
for (child = bus->children; child; child = child->sibling) {
|
||||||
|
// make sure that we have an ops structure
|
||||||
|
if (!child->ops) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (!child->ops->scan_bus) {
|
if (!child->ops->scan_bus) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -767,17 +771,17 @@ static void pci_level_irq(unsigned char intNum)
|
|||||||
{
|
{
|
||||||
unsigned short intBits = inb(0x4d0) | (((unsigned) inb(0x4d1)) << 8);
|
unsigned short intBits = inb(0x4d0) | (((unsigned) inb(0x4d1)) << 8);
|
||||||
|
|
||||||
printk_spew("%s: current ints are 0x%x\n", __FUNCTION__, intBits);
|
printk_debug("%s: current ints are 0x%x\n", __FUNCTION__, intBits);
|
||||||
intBits |= (1 << intNum);
|
intBits |= (1 << intNum);
|
||||||
|
|
||||||
printk_spew("%s: try to set ints 0x%x\n", __FUNCTION__, intBits);
|
printk_debug("%s: try to set ints 0x%x\n", __FUNCTION__, intBits);
|
||||||
|
|
||||||
// Write new values
|
// Write new values
|
||||||
outb((unsigned char) intBits, 0x4d0);
|
outb((unsigned char) intBits, 0x4d0);
|
||||||
outb((unsigned char) (intBits >> 8), 0x4d1);
|
outb((unsigned char) (intBits >> 8), 0x4d1);
|
||||||
|
|
||||||
/* this seems like an error but is not ... */
|
/* this seems like an error but is not ... */
|
||||||
#if 0
|
#if 1
|
||||||
if (inb(0x4d0) != (intBits & 0xf)) {
|
if (inb(0x4d0) != (intBits & 0xf)) {
|
||||||
printk_err("%s: lower order bits are wrong: want 0x%x, got 0x%x\n",
|
printk_err("%s: lower order bits are wrong: want 0x%x, got 0x%x\n",
|
||||||
__FUNCTION__, intBits &0xf, inb(0x4d0));
|
__FUNCTION__, intBits &0xf, inb(0x4d0));
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#if !defined(ASSEMBLY)
|
#if !defined(ASSEMBLY)
|
||||||
|
|
||||||
void set_var_mtrr(unsigned int reg, unsigned long base, unsigned long size, unsigned char type);
|
void set_var_mtrr(unsigned int reg, unsigned long base, unsigned long size, unsigned char type);
|
||||||
|
void add_var_mtrr(unsigned long basek, unsigned long sizek, unsigned char type);
|
||||||
#if defined(INTEL_PPRO_MTRR)
|
#if defined(INTEL_PPRO_MTRR)
|
||||||
struct mem_range;
|
struct mem_range;
|
||||||
void setup_mtrrs(struct mem_range *mem);
|
void setup_mtrrs(struct mem_range *mem);
|
||||||
|
@ -23,6 +23,7 @@ uses _ROMBASE
|
|||||||
uses XIP_ROM_SIZE
|
uses XIP_ROM_SIZE
|
||||||
uses XIP_ROM_BASE
|
uses XIP_ROM_BASE
|
||||||
uses HAVE_MP_TABLE
|
uses HAVE_MP_TABLE
|
||||||
|
uses HAVE_ACPI_TABLES
|
||||||
|
|
||||||
## ROM_SIZE is the size of boot ROM that this board will use.
|
## ROM_SIZE is the size of boot ROM that this board will use.
|
||||||
default ROM_SIZE = 256*1024
|
default ROM_SIZE = 256*1024
|
||||||
@ -130,6 +131,11 @@ arch i386 end
|
|||||||
driver mainboard.o
|
driver mainboard.o
|
||||||
#object reset.o
|
#object reset.o
|
||||||
|
|
||||||
|
if HAVE_ACPI_TABLES
|
||||||
|
object fadt.o
|
||||||
|
object dsdt.o
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
## Romcc output
|
## Romcc output
|
||||||
##
|
##
|
||||||
@ -218,6 +224,14 @@ northbridge via/vt8623 "vt8623"
|
|||||||
register "enable_keyboard" = "0"
|
register "enable_keyboard" = "0"
|
||||||
register "enable_nvram" = "1"
|
register "enable_nvram" = "1"
|
||||||
end
|
end
|
||||||
|
southbridge ricoh/rl5c476 "rl5c476"
|
||||||
|
end
|
||||||
|
superio via/vt1211 "vt1211"
|
||||||
|
register "enable_com_ports" = "1"
|
||||||
|
register "enable_hwmon" = "1"
|
||||||
|
register "enable_lpt" = "1"
|
||||||
|
register "enable_fdc" = "1"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
cpu p6 "cpu0"
|
cpu p6 "cpu0"
|
||||||
|
@ -49,7 +49,7 @@ static inline int spd_read_byte(unsigned device, unsigned address)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "northbridge/via/vt8601/raminit.c"
|
#include "northbridge/via/vt8623/raminit.c"
|
||||||
/*
|
/*
|
||||||
#include "sdram/generic_sdram.c"
|
#include "sdram/generic_sdram.c"
|
||||||
*/
|
*/
|
||||||
@ -64,8 +64,9 @@ static void enable_mainboard_devices(void)
|
|||||||
if (dev == PCI_DEV_INVALID) {
|
if (dev == PCI_DEV_INVALID) {
|
||||||
die("Southbridge not found!!!\n");
|
die("Southbridge not found!!!\n");
|
||||||
}
|
}
|
||||||
pci_write_config8(dev, 0x50, 7);
|
pci_write_config8(dev, 0x50, 0);
|
||||||
pci_write_config8(dev, 0x51, 0xff);
|
pci_write_config8(dev, 0x51, 0xfd);
|
||||||
|
pci_write_config8(dev, 0x94, 0xb2);
|
||||||
#if 0
|
#if 0
|
||||||
// This early setup switches IDE into compatibility mode before PCI gets
|
// This early setup switches IDE into compatibility mode before PCI gets
|
||||||
// // a chance to assign I/Os
|
// // a chance to assign I/Os
|
||||||
@ -97,9 +98,15 @@ static void enable_shadow_ram(void)
|
|||||||
static void main(void)
|
static void main(void)
|
||||||
{
|
{
|
||||||
unsigned long x;
|
unsigned long x;
|
||||||
|
device_t dev;
|
||||||
/* init_timer();*/
|
/* init_timer();*/
|
||||||
outb(5, 0x80);
|
outb(5, 0x80);
|
||||||
|
|
||||||
|
|
||||||
|
pci_write_config8( 0xd*8,0x15,0x1c);
|
||||||
|
pci_write_config8( 0 , 0xe1, 0xdd);
|
||||||
|
|
||||||
|
outb(5, 0x80);
|
||||||
enable_smbus();
|
enable_smbus();
|
||||||
enable_vt8235_serial();
|
enable_vt8235_serial();
|
||||||
|
|
||||||
|
155
src/mainboard/via/epia-m/fadt.c
Normal file
155
src/mainboard/via/epia-m/fadt.c
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
/*
|
||||||
|
* ACPI - create the Fixed ACPI Description Tables (FADT)
|
||||||
|
* (C) Copyright 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., 59 Temple Place, Suite 330, Boston,
|
||||||
|
* MA 02111-1307 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,"LXBIOS",6);
|
||||||
|
memcpy(header->oem_table_id,"LXBACPI ",8);
|
||||||
|
memcpy(header->asl_compiler_id,"LXB",8);
|
||||||
|
header->asl_compiler_revision=0;
|
||||||
|
|
||||||
|
fadt->firmware_ctrl=facs;
|
||||||
|
fadt->dsdt= dsdt;
|
||||||
|
fadt->preferred_pm_profile=0;
|
||||||
|
fadt->sci_int=5;
|
||||||
|
fadt->smi_cmd = 0;
|
||||||
|
fadt->acpi_enable = 0;
|
||||||
|
fadt->acpi_disable = 0;
|
||||||
|
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 = 0;
|
||||||
|
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 = 90;
|
||||||
|
fadt->p_lvl3_lat = 900;
|
||||||
|
fadt->flush_size = 0;
|
||||||
|
fadt->flush_stride = 0;
|
||||||
|
fadt->duty_offset = 0;
|
||||||
|
fadt->duty_width = 1;
|
||||||
|
fadt->day_alrm = 125;
|
||||||
|
fadt->mon_alrm = 126;
|
||||||
|
fadt->century = 50;
|
||||||
|
fadt->iapc_boot_arch = 0x1;
|
||||||
|
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));
|
||||||
|
|
||||||
|
}
|
@ -1,32 +1,30 @@
|
|||||||
/* This file was generated by getpir.c, do not modify!
|
/* This file was generated by getpir.c, do not modify!
|
||||||
(but if you do, please run checkpir on it to verify)
|
(but if you do, please run checkpir on it to verify)
|
||||||
Contains the IRQ Routing Table dumped directly from your memory , wich BIOS sets up
|
* Contains the IRQ Routing Table dumped directly from your memory, which BIOS sets up
|
||||||
|
*
|
||||||
Documentation at : http://www.microsoft.com/hwdev/busbios/PCIIRQ.HTM
|
* Documentation at : http://www.microsoft.com/hwdev/busbios/PCIIRQ.HTM
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <arch/pirq_routing.h>
|
#include <arch/pirq_routing.h>
|
||||||
|
|
||||||
const struct irq_routing_table intel_irq_routing_table = {
|
const struct irq_routing_table intel_irq_routing_table = {
|
||||||
PIRQ_SIGNATURE, /* u32 signature */
|
PIRQ_SIGNATURE, /* u32 signature */
|
||||||
PIRQ_VERSION, /* u16 version */
|
PIRQ_VERSION, /* u16 version */
|
||||||
32+16*5, /* there can be total 5 devices on the bus */
|
32+16*5, /* there can be total 5 devices on the bus */
|
||||||
0, /* Where the interrupt router lies (bus) */
|
0x00, /* Where the interrupt router lies (bus) */
|
||||||
0x88, /* Where the interrupt router lies (dev) */
|
(0x00<<3)|0x0, /* Where the interrupt router lies (dev) */
|
||||||
0x1c20, /* IRQs devoted exclusively to PCI usage */
|
0xc20, /* IRQs devoted exclusively to PCI usage */
|
||||||
0x1106, /* Vendor */
|
0, /* Vendor */
|
||||||
0x8231, /* Device */
|
0, /* Device */
|
||||||
0, /* Crap (miniport) */
|
0, /* Crap (miniport) */
|
||||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* u8 rfu[11] */
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* u8 rfu[11] */
|
||||||
0x5e, /* u8 checksum , this hase to set to some value that would give 0 after the sum of all bytes for this structure (including checksum) */
|
0x68, /* u8 checksum , this hase to set to some value that would give 0 after the sum of all bytes for this structure (including checksum) */
|
||||||
{
|
{
|
||||||
/* 8231 ethernet */
|
/* bus, dev|fn, {link, bitmap}, {link, bitmap}, {link, bitmap}, {link, bitmap}, slot, rfu */
|
||||||
{0,0x90, {{0x1, 0xdeb8}, {0x2, 0xdeb8}, {0x3, 0xdeb8}, {0x4, 0xdeb8}}, 0x1, 0},
|
{0x00,(0x14<<3)|0x0, {{0x02, 0xdeb8}, {0x03, 0xdeb8}, {0x04, 0xdeb8}, {0x01, 0x0deb8}}, 0x1, 0x0},
|
||||||
/* 8231 internal */
|
{0x00,(0x13<<3)|0x0, {{0x01, 0xdeb8}, {0x02, 0xdeb8}, {0x03, 0xdeb8}, {0x04, 0x0deb8}}, 0x2, 0x0},
|
||||||
{0,0x88, {{0x2, 0xdeb8}, {0x3, 0xdeb8}, {0x4, 0xdeb8}, {0x1, 0xdeb8}}, 0x2, 0},
|
{0x00,(0x0a<<3)|0x0, {{0x04, 0xdeb8}, {0x01, 0xdeb8}, {0x02, 0xdeb8}, {0x03, 0x0deb8}}, 0x3, 0x0},
|
||||||
/* PCI slot */
|
{0x00,(0x0d<<3)|0x0, {{0x02, 0xdeb8}, {0x03, 0xdeb8}, {0x04, 0xdeb8}, {0x01, 0x0deb8}}, 0x4, 0x0},
|
||||||
{0,0xa0, {{0x3, 0xdeb8}, {0x4, 0xdeb8}, {0x1, 0xdeb8}, {0x2, 0xdeb8}}, 0, 0},
|
{0x00,(0x01<<3)|0x0, {{0x01, 0xdeb8}, {0x02, 0xdeb8}, {0x03, 0xdeb8}, {0x04, 0x0deb8}}, 0x0, 0x0},
|
||||||
{0,0x50, {{0x4, 0xdeb8}, {0x3, 0xdeb8}, {0x2, 0xdeb8}, {0x1, 0xdeb8}}, 0x3, 0},
|
|
||||||
{0,0x98, {{0x4, 0xdeb8}, {0x3, 0xdeb8}, {0x2, 0xdeb8}, {0x1, 0xdeb8}}, 0x4, 0},
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -9,6 +9,9 @@
|
|||||||
#include <device/chip.h>
|
#include <device/chip.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
|
void vga_enable_console();
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mainboard_scan_bus(device_t root, int maxbus)
|
mainboard_scan_bus(device_t root, int maxbus)
|
||||||
{
|
{
|
||||||
@ -19,6 +22,56 @@ mainboard_scan_bus(device_t root, int maxbus)
|
|||||||
return maxbus;
|
return maxbus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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");
|
||||||
|
dev = dev_find_device(PCI_VENDOR_ID_VIA, 0x3123, 0);
|
||||||
|
if(dev)
|
||||||
|
pci_write_config8(dev, 0x61, 0xaa);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
enable(struct chip *chip, enum chip_pass pass)
|
||||||
|
{
|
||||||
|
|
||||||
|
struct mainboard_tyan_s4882_config *conf =
|
||||||
|
(struct mainboard_tyan_s4882_config *)chip->chip_info;
|
||||||
|
|
||||||
|
switch (pass) {
|
||||||
|
default: break;
|
||||||
|
// case CONF_PASS_PRE_CONSOLE:
|
||||||
|
// case CONF_PASS_PRE_PCI:
|
||||||
|
case CONF_PASS_POST_PCI:
|
||||||
|
// case CONF_PASS_PRE_BOOT:
|
||||||
|
// if (conf->fixup_scsi)
|
||||||
|
// onboard_scsi_fixup();
|
||||||
|
// if (conf->fixup_vga)
|
||||||
|
// vga_fixup();
|
||||||
|
printk_debug("mainboard fixup pass %d done\r\n",
|
||||||
|
pass);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
static struct device_operations mainboard_operations = {
|
static struct device_operations mainboard_operations = {
|
||||||
.read_resources = root_dev_read_resources,
|
.read_resources = root_dev_read_resources,
|
||||||
.set_resources = root_dev_set_resources,
|
.set_resources = root_dev_set_resources,
|
||||||
@ -41,5 +94,6 @@ static void enumerate(struct chip *chip)
|
|||||||
struct chip_control mainboard_via_epia_m_control = {
|
struct chip_control mainboard_via_epia_m_control = {
|
||||||
.enumerate = enumerate,
|
.enumerate = enumerate,
|
||||||
.name = "VIA EPIA-M mainboard ",
|
.name = "VIA EPIA-M mainboard ",
|
||||||
|
.enable = enable
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -6,15 +6,16 @@
|
|||||||
#include <device/device.h>
|
#include <device/device.h>
|
||||||
#include <device/pci.h>
|
#include <device/pci.h>
|
||||||
#include <device/hypertransport.h>
|
#include <device/hypertransport.h>
|
||||||
|
#include <device/pci_ids.h>
|
||||||
#include <device/chip.h>
|
#include <device/chip.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <bitops.h>
|
#include <bitops.h>
|
||||||
|
#include <cpu/p6/mtrr.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
#include "northbridge.h"
|
#include "northbridge.h"
|
||||||
|
|
||||||
static const uint8_t ramregs[] = {0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
|
static const uint8_t ramregs[] = {0x5a, 0x5b, 0x5c, 0x5d };
|
||||||
0x56, 0x57};
|
|
||||||
|
|
||||||
struct mem_range *sizeram(void)
|
struct mem_range *sizeram(void)
|
||||||
{
|
{
|
||||||
@ -30,8 +31,9 @@ struct mem_range *sizeram(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
mem[0].basek = 0;
|
mem[0].basek = 0;
|
||||||
mem[0].sizek = 65536;
|
mem[0].sizek = 0xa0000 >>10; // first 640k
|
||||||
idx = 1;
|
mem[1].basek = 0xc0000 >>10; // leave a hole for vga
|
||||||
|
idx = 2;
|
||||||
while(idx < sizeof(mem)/sizeof(mem[0])) {
|
while(idx < sizeof(mem)/sizeof(mem[0])) {
|
||||||
mem[idx].basek = 0;
|
mem[idx].basek = 0;
|
||||||
mem[idx].sizek = 0;
|
mem[idx].sizek = 0;
|
||||||
@ -53,8 +55,8 @@ struct mem_range *sizeram(void)
|
|||||||
ramregs[i]);
|
ramregs[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
printk_debug("I would set ram size to 0x%x Kbytes\n", (rambits)*8*1024);
|
printk_debug("I would set ram size to 0x%x Kbytes\n", (rambits)*16*1024);
|
||||||
mem[0].sizek = rambits*8*1024;
|
mem[1].sizek = rambits*16*1024 - 32768 - (0xc0000 >> 10);
|
||||||
#if 1
|
#if 1
|
||||||
for(i = 0; i < idx; i++) {
|
for(i = 0; i < idx; i++) {
|
||||||
printk_debug("mem[%d].basek = %08x mem[%d].sizek = %08x\n",
|
printk_debug("mem[%d].basek = %08x mem[%d].sizek = %08x\n",
|
||||||
@ -78,18 +80,65 @@ static void enumerate(struct chip *chip)
|
|||||||
* Apparently these registers govern some sort of bus master behavior.
|
* Apparently these registers govern some sort of bus master behavior.
|
||||||
*/
|
*/
|
||||||
static void random_fixup() {
|
static void random_fixup() {
|
||||||
device_t pcidev = dev_find_slot(0, 0);
|
device_t pcidev0 = dev_find_slot(0, 0);
|
||||||
|
device_t pcidev1,pcidev2;
|
||||||
|
unsigned long fb;
|
||||||
|
unsigned char c;
|
||||||
|
|
||||||
printk_spew("VT8623 random fixup ...\n");
|
printk_debug("VT8623 random fixup ...\n");
|
||||||
if (pcidev) {
|
if (pcidev0) {
|
||||||
pci_write_config8(pcidev, 0x70, 0xc0);
|
pci_write_config8(pcidev0, 0x0d, 0x08);
|
||||||
pci_write_config8(pcidev, 0x71, 0x88);
|
pci_write_config8(pcidev0, 0x70, 0x82);
|
||||||
pci_write_config8(pcidev, 0x72, 0xec);
|
pci_write_config8(pcidev0, 0x71, 0xc8);
|
||||||
pci_write_config8(pcidev, 0x73, 0x0c);
|
pci_write_config8(pcidev0, 0x72, 0x0);
|
||||||
pci_write_config8(pcidev, 0x74, 0x0e);
|
pci_write_config8(pcidev0, 0x73, 0x01);
|
||||||
pci_write_config8(pcidev, 0x75, 0x81);
|
pci_write_config8(pcidev0, 0x74, 0x01);
|
||||||
pci_write_config8(pcidev, 0x76, 0x52);
|
pci_write_config8(pcidev0, 0x75, 0x08);
|
||||||
|
pci_write_config8(pcidev0, 0x76, 0x52);
|
||||||
|
pci_write_config8(pcidev0, 0x13, 0xd0);
|
||||||
|
pci_write_config8(pcidev0, 0x84, 0x80);
|
||||||
|
pci_write_config16(pcidev0,0x80, 0x610f);
|
||||||
|
pci_write_config32(pcidev0,0x88, 0x02);
|
||||||
}
|
}
|
||||||
|
printk_debug("VT8623 AGP random fixup ...\n");
|
||||||
|
pcidev1 = dev_find_device(PCI_VENDOR_ID_VIA,0xb091,0);
|
||||||
|
if( pcidev1) {
|
||||||
|
pci_write_config8(pcidev1,0x3e,0x0c);
|
||||||
|
pci_write_config8(pcidev1,0x40,0x83);
|
||||||
|
pci_write_config8(pcidev1,0x41,0xc5);
|
||||||
|
pci_write_config8(pcidev1,0x43,0x44);
|
||||||
|
pci_write_config8(pcidev1,0x44,0x34);
|
||||||
|
pci_write_config8(pcidev1,0x83,0x02);
|
||||||
|
}
|
||||||
|
printk_debug("VGA random fixup ...\n");
|
||||||
|
pcidev2 = dev_find_device(PCI_VENDOR_ID_VIA,0x3122,0);
|
||||||
|
if( pcidev2 ){
|
||||||
|
pci_write_config8(pcidev2,0x04,0x07);
|
||||||
|
pci_write_config8(pcidev2,0x0d,0x20);
|
||||||
|
}
|
||||||
|
// fixup GART and framebuffer addresses properly
|
||||||
|
// first set up frame buffer properly
|
||||||
|
fb = pci_read_config32(pcidev2,0x10); // base address of framebuffer
|
||||||
|
printk_debug("Frame buffer at %8x\n",fb);
|
||||||
|
c = pci_read_config8(pcidev0,0xe1) & 0xf0; // size of vga
|
||||||
|
c |= fb>>28; // upper nibble of frame buffer address
|
||||||
|
pci_write_config8(pcidev0,0xe1,c);
|
||||||
|
c = (fb>>20) | 1; // enable framebuffer
|
||||||
|
pci_write_config8(pcidev0,0xe0,c);
|
||||||
|
pci_write_config8(pcidev0,0xe2,0x42); // 'cos award does
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
static void set_vga_mtrrs(void)
|
||||||
|
{
|
||||||
|
device_t pcidev = dev_find_device(PCI_VENDOR_ID_VIA,0x3122,0);
|
||||||
|
unsigned long fb;
|
||||||
|
|
||||||
|
add_var_mtrr( 0xd0000000 >> 10, 0x08000000>>10, MTRR_TYPE_WRCOMB);
|
||||||
|
fb = pci_read_config32(pcidev,0x10); // get the fb address
|
||||||
|
add_var_mtrr( fb>>10, 8192, MTRR_TYPE_WRCOMB);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void northbridge_init(struct chip *chip, enum chip_pass pass)
|
static void northbridge_init(struct chip *chip, enum chip_pass pass)
|
||||||
@ -103,10 +152,11 @@ static void northbridge_init(struct chip *chip, enum chip_pass pass)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CONF_PASS_POST_PCI:
|
case CONF_PASS_POST_PCI:
|
||||||
|
random_fixup();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONF_PASS_PRE_BOOT:
|
case CONF_PASS_PRE_BOOT:
|
||||||
random_fixup();
|
set_vga_mtrrs();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -47,16 +47,17 @@ it with the version available from LANL.
|
|||||||
#define DIMM_CL2 0
|
#define DIMM_CL2 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void dimms_read(unsigned long x)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void dimm_read(unsigned long x)
|
||||||
{
|
{
|
||||||
uint8_t c;
|
|
||||||
unsigned long eax;
|
unsigned long eax;
|
||||||
volatile unsigned long y;
|
volatile unsigned long y;
|
||||||
eax = x;
|
eax = x;
|
||||||
for(c = 0; c < 6; c++) {
|
y = * (volatile unsigned long *) eax;
|
||||||
y = * (volatile unsigned long *) eax;
|
|
||||||
eax += 0x10000000;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dimms_write(int x)
|
void dimms_write(int x)
|
||||||
@ -88,7 +89,7 @@ void setnorthb(device_t north, uint8_t reg, uint8_t val)
|
|||||||
void
|
void
|
||||||
dumpnorth(device_t north)
|
dumpnorth(device_t north)
|
||||||
{
|
{
|
||||||
uint8_t r, c;
|
uint16_t r, c;
|
||||||
for(r = 0; r < 256; r += 16) {
|
for(r = 0; r < 256; r += 16) {
|
||||||
print_debug_hex8(r);
|
print_debug_hex8(r);
|
||||||
print_debug(":");
|
print_debug(":");
|
||||||
@ -106,7 +107,7 @@ static void sdram_set_registers(const struct mem_controller *ctrl)
|
|||||||
uint8_t c, r;
|
uint8_t c, r;
|
||||||
|
|
||||||
print_err("vt8623 init starting\r\n");
|
print_err("vt8623 init starting\r\n");
|
||||||
north = pci_locate_device(PCI_ID(0x1106, 0x8623), 0);
|
north = pci_locate_device(PCI_ID(0x1106, 0x3123), 0);
|
||||||
north = 0;
|
north = 0;
|
||||||
print_debug_hex32(north);
|
print_debug_hex32(north);
|
||||||
print_debug(" is the north\n");
|
print_debug(" is the north\n");
|
||||||
@ -118,66 +119,57 @@ static void sdram_set_registers(const struct mem_controller *ctrl)
|
|||||||
/* All we are doing now is setting initial known-good values that will
|
/* All we are doing now is setting initial known-good values that will
|
||||||
* be revised later as we read SPD
|
* be revised later as we read SPD
|
||||||
*/
|
*/
|
||||||
// memory clk enable. We are not using ECC
|
|
||||||
pci_write_config8(north,0x78, 0x01);
|
pci_write_config8(north,0x75,0x08);
|
||||||
print_debug_hex8(pci_read_config8(north, 0x78));
|
|
||||||
// dram control, see the book.
|
/* since we only support epia-m at the moment, only ddr is supported */
|
||||||
#if DIMM_PC133
|
/* setup cpu */
|
||||||
pci_write_config8(north,0x68, 0x52);
|
pci_write_config8(north,0x50,0xc8);
|
||||||
#else
|
pci_write_config8(north,0x51,0xde);
|
||||||
pci_write_config8(north,0x68, 0x42);
|
pci_write_config8(north,0x52,0xcf);
|
||||||
#endif
|
pci_write_config8(north,0x53,0x88);
|
||||||
// dram control, see the book.
|
pci_write_config8(north,0x55,0x07);
|
||||||
pci_write_config8(north,0x6B, 0x0c);
|
|
||||||
// Initial setting, 256MB in each bank, will be rewritten later.
|
/* DRAM MA Map Type */
|
||||||
pci_write_config8(north,0x5A, 0x20);
|
pci_write_config8(north,0x58,0xe0);
|
||||||
print_debug_hex8(pci_read_config8(north, 0x5a));
|
|
||||||
pci_write_config8(north,0x5B, 0x40);
|
/* DRAM bank 0 - 3 size = 512M */
|
||||||
pci_write_config8(north,0x5C, 0x60);
|
pci_write_config8(north,0x5a,0x10);
|
||||||
pci_write_config8(north,0x5D, 0x80);
|
pci_write_config8(north,0x5b,0x10);
|
||||||
pci_write_config8(north,0x5E, 0xA0);
|
pci_write_config8(north,0x5c,0x10);
|
||||||
pci_write_config8(north,0x5F, 0xC0);
|
pci_write_config8(north,0x5d,0x10);
|
||||||
// It seems we have to take care of these 2 registers as if
|
|
||||||
// they are bank 6 and 7.
|
/* set DRAM timing for all banks */
|
||||||
pci_write_config8(north,0x56, 0xC0);
|
pci_write_config8(north,0x64,0xe6);
|
||||||
pci_write_config8(north,0x57, 0xC0);
|
|
||||||
|
/* set DRAM type to DDR */
|
||||||
|
pci_write_config8(north,0x60,0x02);
|
||||||
|
|
||||||
|
|
||||||
|
/* DRAM arbitration timer */
|
||||||
|
pci_write_config8(north,0x65,0x32);
|
||||||
|
pci_write_config8(north,0x66,0x01);
|
||||||
|
pci_write_config8(north,0x68,0x59);
|
||||||
|
|
||||||
|
|
||||||
|
/* DRAM Frequency */
|
||||||
|
pci_write_config8(north,0x54,0xe0);
|
||||||
|
pci_write_config8(north,0x69,0x2d);
|
||||||
|
|
||||||
|
/* Enable CKE */
|
||||||
|
pci_write_config8(north,0x6b,0x10);
|
||||||
|
|
||||||
// SDRAM in all banks
|
/* Disable DRAM refresh */
|
||||||
pci_write_config8(north,0x60, 0x3F);
|
pci_write_config8(north,0x6a,0x0);
|
||||||
// DRAM timing. I'm suspicious of this
|
|
||||||
// This is for all banks, 64 is 0,1. 65 is 2,3. 66 is 4,5.
|
/* set heavy drive */
|
||||||
// ras precharge 4T, RAS pulse 5T
|
pci_write_config8(north,0x6d,0x44);
|
||||||
// cas2 is 0xd6, cas3 is 0xe6
|
|
||||||
// we're also backing off write pulse width to 2T, so result is 0xee
|
|
||||||
#if DIMM_CL2
|
pci_write_config8(north,0x61,0xff);
|
||||||
pci_write_config8(north,0x64, 0xd4);
|
|
||||||
pci_write_config8(north,0x65, 0xd4);
|
|
||||||
pci_write_config8(north,0x66, 0xd4);
|
|
||||||
#else // CL=3
|
|
||||||
pci_write_config8(north,0x64, 0xe4);
|
|
||||||
pci_write_config8(north,0x65, 0xe4);
|
|
||||||
pci_write_config8(north,0x66, 0xe4);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// dram frequency select.
|
|
||||||
// enable 4K pages for 64M dram.
|
|
||||||
#if DIMM_PC133
|
|
||||||
pci_write_config8(north,0x69, 0x3c);
|
|
||||||
#else
|
|
||||||
pci_write_config8(north,0x69, 0xac);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* IMPORTANT -- disable refresh counter */
|
|
||||||
// refresh counter, disabled.
|
|
||||||
pci_write_config8(north,0x6A, 0x00);
|
|
||||||
|
|
||||||
|
|
||||||
// clkenable configuration. kevinh FIXME - add precharge
|
|
||||||
pci_write_config8(north,0x6C, 0x00);
|
|
||||||
// dram read latch delay of 1 ns, MD drive 8 mA,
|
|
||||||
// high drive strength on MA[2: 13], we#, cas#, ras#
|
|
||||||
// As per Cindy Lee, set to 0x37, not 0x57
|
|
||||||
pci_write_config8(north,0x6D, 0x7f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* slot is the dram slot. Return size of side0 in lower 16-bit,
|
/* slot is the dram slot. Return size of side0 in lower 16-bit,
|
||||||
@ -291,104 +283,87 @@ static void sdram_enable(int controllers, const struct mem_controller *ctrl)
|
|||||||
};
|
};
|
||||||
device_t north = 0;
|
device_t north = 0;
|
||||||
uint32_t size, base, slot, ma;
|
uint32_t size, base, slot, ma;
|
||||||
/* begin to initialize*/
|
|
||||||
// I forget why we need this, but we do
|
|
||||||
dimms_write(0xa55a5aa5);
|
|
||||||
|
|
||||||
/* set NOP*/
|
|
||||||
pci_write_config8(north,0x6C, 0x01);
|
|
||||||
print_debug("NOP\r\n");
|
|
||||||
/* wait 200us*/
|
|
||||||
// You need to do the memory reference. That causes the nop cycle.
|
|
||||||
dimms_read(0);
|
|
||||||
udelay(400);
|
|
||||||
print_debug("PRECHARGE\r\n");
|
|
||||||
/* set precharge */
|
|
||||||
pci_write_config8(north,0x6C, 0x02);
|
|
||||||
print_debug("DUMMY READS\r\n");
|
|
||||||
/* dummy reads*/
|
|
||||||
dimms_read(0);
|
|
||||||
udelay(200);
|
|
||||||
print_debug("CBR\r\n");
|
|
||||||
/* set CBR*/
|
|
||||||
pci_write_config8(north,0x6C, 0x04);
|
|
||||||
|
|
||||||
/* do 8 reads and wait >100us between each - from via*/
|
|
||||||
dimms_read(0);
|
|
||||||
udelay(200);
|
|
||||||
dimms_read(0);
|
|
||||||
udelay(200);
|
|
||||||
dimms_read(0);
|
|
||||||
udelay(200);
|
|
||||||
dimms_read(0);
|
|
||||||
udelay(200);
|
|
||||||
dimms_read(0);
|
|
||||||
udelay(200);
|
|
||||||
dimms_read(0);
|
|
||||||
udelay(200);
|
|
||||||
dimms_read(0);
|
|
||||||
udelay(200);
|
|
||||||
dimms_read(0);
|
|
||||||
udelay(200);
|
|
||||||
print_debug("MRS\r\n");
|
|
||||||
/* set MRS*/
|
|
||||||
pci_write_config8(north,0x6c, 0x03);
|
|
||||||
#if DIMM_CL2
|
|
||||||
dimms_read(0x150);
|
|
||||||
#else // CL=3
|
|
||||||
dimms_read(0x1d0);
|
|
||||||
#endif
|
|
||||||
udelay(200);
|
|
||||||
print_debug("NORMAL\r\n");
|
|
||||||
/* set to normal mode */
|
|
||||||
pci_write_config8(north,0x6C, 0x08);
|
|
||||||
|
|
||||||
dimms_write(0x55aa55aa);
|
|
||||||
dimms_read(0);
|
|
||||||
udelay(200);
|
|
||||||
print_debug("set ref. rate\r\n");
|
|
||||||
// Set the refresh rate.
|
|
||||||
#if DIMM_PC133
|
|
||||||
pci_write_config8(north,0x6A, 0x86);
|
|
||||||
#else
|
|
||||||
pci_write_config8(north,0x6A, 0x65);
|
|
||||||
#endif
|
|
||||||
print_debug("enable multi-page open\r\n");
|
|
||||||
// enable multi-page open
|
|
||||||
pci_write_config8(north,0x6B, 0x0d);
|
|
||||||
|
|
||||||
base = 0;
|
|
||||||
for(slot = 0; slot < 4; slot++) {
|
|
||||||
size = spd_module_size(slot);
|
|
||||||
/* side 0 */
|
|
||||||
base += size & 0xffff;
|
|
||||||
pci_write_config8(north, ramregs[2*slot], base);
|
|
||||||
/* side 1 */
|
|
||||||
base += size >> 16;
|
|
||||||
if (base > 0xff)
|
|
||||||
base = 0xff;
|
|
||||||
pci_write_config8(north, ramregs[2*slot + 1], base);
|
|
||||||
|
|
||||||
if (!size)
|
/* NOP command enable */
|
||||||
continue;
|
pci_write_config8(north,0x6b,0x01);
|
||||||
|
|
||||||
/* Calculate the value of MA mapping type register,
|
/* read a double word from any addree of the dimm */
|
||||||
* based on size of SDRAM chips. */
|
dimm_read(0x1f000);
|
||||||
size = (size & 0xffff) << (3 + 3);
|
udelay(200);
|
||||||
/* convert module size to be in Mbits */
|
|
||||||
size /= spd_num_chips(slot);
|
/* All bank precharge Command Enable */
|
||||||
print_debug_hex16(size);
|
pci_write_config8(north,0x6b,0x02);
|
||||||
print_debug(" is the chip size\r\n");
|
dimm_read(0x1f000);
|
||||||
if (size < 64)
|
|
||||||
ma = 0;
|
/* MSR Enable */
|
||||||
if (size < 256)
|
pci_write_config8(north,0x6b,0x03);
|
||||||
ma = 8;
|
dimm_read(0x2000);
|
||||||
else
|
|
||||||
ma = 0xe;
|
dimm_read(0x800);
|
||||||
print_debug_hex16(ma);
|
|
||||||
print_debug(" is the MA type\r\n");
|
/* All banks precharge Command Enable */
|
||||||
set_ma_mapping(north, slot, ma);
|
pci_write_config8(north,0x6b,0x02);
|
||||||
}
|
dimm_read(0x1f200);
|
||||||
print_err("vt8623 done\r\n");
|
|
||||||
|
/* CBR Cycle Enable */
|
||||||
|
pci_write_config8(north,0x6b,0x04);
|
||||||
|
|
||||||
|
/* Read 8 times */
|
||||||
|
dimm_read(0x1f300);
|
||||||
|
udelay(100);
|
||||||
|
dimm_read(0x1f400);
|
||||||
|
udelay(100);
|
||||||
|
dimm_read(0x1f500);
|
||||||
|
udelay(100);
|
||||||
|
dimm_read(0x1f600);
|
||||||
|
udelay(100);
|
||||||
|
dimm_read(0x1f700);
|
||||||
|
udelay(100);
|
||||||
|
dimm_read(0x1f800);
|
||||||
|
udelay(100);
|
||||||
|
dimm_read(0x1f900);
|
||||||
|
udelay(100);
|
||||||
|
dimm_read(0x1fa00);
|
||||||
|
udelay(100);
|
||||||
|
|
||||||
|
/* MSR Enable */
|
||||||
|
pci_write_config8(north,0x6b,0x03);
|
||||||
|
|
||||||
|
/* 0x150 if CAS Latency 2 or 0x350 CAS Latency 2.5 */
|
||||||
|
dimm_read(0x350);
|
||||||
|
|
||||||
|
/* Normal SDRAM Mode */
|
||||||
|
pci_write_config8(north,0x6b,0x58 );
|
||||||
|
|
||||||
|
|
||||||
|
/* Set the refresh rate */
|
||||||
|
pci_write_config8(north,0x6a,0x43);
|
||||||
|
pci_write_config8(north,0x67,0x22);
|
||||||
|
|
||||||
|
/* pci */
|
||||||
|
pci_write_config8(north,0x70,0x82);
|
||||||
|
pci_write_config8(north,0x73,0x01);
|
||||||
|
pci_write_config8(north,0x76,0x50);
|
||||||
|
|
||||||
|
|
||||||
|
pci_write_config8(north,0x71,0xc8);
|
||||||
|
|
||||||
|
|
||||||
|
/* graphics aperture base */
|
||||||
|
pci_write_config8(north,0x13,0xd0);
|
||||||
|
|
||||||
|
//pci_write_config8(north,0x56,0x10);
|
||||||
|
//pci_write_config8(north,0x57,0x10);
|
||||||
|
|
||||||
|
pci_write_config8(north,0xe0,0x80);
|
||||||
|
pci_write_config8(north,0xe1,0xdf);
|
||||||
|
pci_write_config8(north,0xe2,0x42);
|
||||||
|
|
||||||
|
pci_write_config8(north,0xa8,0x04);
|
||||||
|
pci_write_config8(north,0xac,0x2f);
|
||||||
|
pci_write_config8(north,0xae,0x04);
|
||||||
|
|
||||||
|
print_err("vt8623 done\r\n");
|
||||||
dumpnorth(north);
|
dumpnorth(north);
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ uses CONFIG_LEGACY_VGABIOS
|
|||||||
|
|
||||||
object mc146818rtc.o
|
object mc146818rtc.o
|
||||||
object isa-dma.o
|
object isa-dma.o
|
||||||
#object i8259.o CONFIG_I8259
|
object i8259.o
|
||||||
#object udelay_timer2.o CONFIG_UDELAY_TIMER2
|
#object udelay_timer2.o CONFIG_UDELAY_TIMER2
|
||||||
#object beep.o CONFIG_BEEP
|
#object beep.o CONFIG_BEEP
|
||||||
#object vga_load_regs.o VIDEO_CONSOLE
|
#object vga_load_regs.o VIDEO_CONSOLE
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
/* much better keyboard init courtesy ollie@sis.com.tw
|
/* much better keyboard init courtesy ollie@sis.com.tw
|
||||||
TODO: Typematic Setting, the keyboard is too slow for me */
|
TODO: Typematic Setting, the keyboard is too slow for me */
|
||||||
static void pc_keyboard_init(struct pc_keyboard *keyboard)
|
void pc_keyboard_init(struct pc_keyboard *keyboard)
|
||||||
{
|
{
|
||||||
volatile unsigned char regval;
|
volatile unsigned char regval;
|
||||||
|
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
#include <pci.h>
|
#include <console/console.h>
|
||||||
#include <pci_ids.h>
|
#include <device/pci.h>
|
||||||
|
#include <device/pci_ids.h>
|
||||||
|
#include <device/pci_ops.h>
|
||||||
#undef __KERNEL__
|
#undef __KERNEL__
|
||||||
#include <arch/io.h>
|
#include <arch/io.h>
|
||||||
#include <printk.h>
|
//#include <printk.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "vgachip.h"
|
#include "vgachip.h"
|
||||||
|
|
||||||
@ -121,6 +123,8 @@ static void real_mode_switch_call_vga(unsigned long devfn)
|
|||||||
" mov %ax, %es \n"
|
" mov %ax, %es \n"
|
||||||
" mov %ax, %fs \n"
|
" mov %ax, %fs \n"
|
||||||
" mov %ax, %gs \n"
|
" mov %ax, %gs \n"
|
||||||
|
" mov $0x40, %ax \n"
|
||||||
|
" mov %ax, %ds \n"
|
||||||
" mov %cx, %ax \n"
|
" mov %cx, %ax \n"
|
||||||
" .byte 0x9a, 0x03, 0, 0, 0xc0 \n"
|
" .byte 0x9a, 0x03, 0, 0, 0xc0 \n"
|
||||||
" movb $0x55, %al\noutb %al, $0x80\n"
|
" movb $0x55, %al\noutb %al, $0x80\n"
|
||||||
@ -151,10 +155,99 @@ static void real_mode_switch_call_vga(unsigned long devfn)
|
|||||||
__asm__ (".text\n""real_mode_switch_end:\n");
|
__asm__ (".text\n""real_mode_switch_end:\n");
|
||||||
extern char real_mode_switch_end[];
|
extern char real_mode_switch_end[];
|
||||||
|
|
||||||
|
/* call vga bios int 10 function 0x4f14 to enable main console
|
||||||
|
epia-m does not always autosence the main console so forcing it on is good !! */
|
||||||
|
|
||||||
|
void vga_enable_console()
|
||||||
|
{
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
// paranoia -- does ecx get saved? not sure. This is
|
||||||
|
// the easiest safe thing to do.
|
||||||
|
" pushal\n"
|
||||||
|
/* save the stack */
|
||||||
|
" mov %esp, __stack\n"
|
||||||
|
|
||||||
|
/* This configures CS properly for real mode. */
|
||||||
|
" ljmp $0x28, $__vga_ec_16bit\n"
|
||||||
|
"__vga_ec_16bit: \n"
|
||||||
|
".code16 \n"
|
||||||
|
/* 16 bit code from here on... */
|
||||||
|
|
||||||
|
/* Load the segment registers w/ properly configured segment
|
||||||
|
* descriptors. They will retain these configurations (limits,
|
||||||
|
* writability, etc.) once protected mode is turned off. */
|
||||||
|
" mov $0x30, %ax \n"
|
||||||
|
" mov %ax, %ds \n"
|
||||||
|
" mov %ax, %es \n"
|
||||||
|
" mov %ax, %fs \n"
|
||||||
|
" mov %ax, %gs \n"
|
||||||
|
" mov %ax, %ss \n"
|
||||||
|
|
||||||
|
/* Turn off protection (bit 0 in CR0) */
|
||||||
|
" movl %cr0, %eax \n"
|
||||||
|
" andl $0xFFFFFFFE, %eax \n"
|
||||||
|
" movl %eax, %cr0 \n"
|
||||||
|
|
||||||
|
/* Now really going into real mode */
|
||||||
|
" ljmp $0, $__vga_ec_real \n"
|
||||||
|
"__vga_ec_real: \n"
|
||||||
|
|
||||||
|
// put the stack at the end of page zero.
|
||||||
|
// that way we can easily share it between real and protected,
|
||||||
|
// since the 16-bit ESP at segment 0 will work for any case.
|
||||||
|
/* Setup a stack */
|
||||||
|
" mov $0x0, %ax \n"
|
||||||
|
" mov %ax, %ss \n"
|
||||||
|
" movl $0x1000, %eax \n"
|
||||||
|
" movl %eax, %esp \n"
|
||||||
|
/* debugging for RGM */
|
||||||
|
" mov $0x11, %al \n"
|
||||||
|
" outb %al, $0x80\n"
|
||||||
|
|
||||||
|
/* Dump zeros in the other segregs */
|
||||||
|
" xor %ax, %ax \n"
|
||||||
|
" mov %ax, %ds \n"
|
||||||
|
" mov %ax, %es \n"
|
||||||
|
" mov %ax, %fs \n"
|
||||||
|
" mov %ax, %gs \n"
|
||||||
|
/* ask bios to enable main console */
|
||||||
|
/* set up for int 10 call - values found from X server bios call routines */
|
||||||
|
" movw $0x4f14,%ax \n"
|
||||||
|
" movw $0x8003,%bx \n"
|
||||||
|
" movw $1, %cx \n"
|
||||||
|
" movw $0, %dx \n"
|
||||||
|
" movw $0, %di \n"
|
||||||
|
" .byte 0xcd, 0x10 \n"
|
||||||
|
" movb $0x55, %al\noutb %al, $0x80\n"
|
||||||
|
/* if we got here, just about done.
|
||||||
|
* Need to get back to protected mode */
|
||||||
|
"movl %cr0, %eax\n"
|
||||||
|
// "andl $0x7FFAFFD1, %eax\n" /* PG,AM,WP,NE,TS,EM,MP = 0 */
|
||||||
|
// "orl $0x60000001, %eax\n" /* CD, NW, PE = 1 */
|
||||||
|
"orl $0x0000001, %eax\n" /* PE = 1 */
|
||||||
|
"movl %eax, %cr0\n"
|
||||||
|
/* Now that we are in protected mode jump to a 32 bit code segment. */
|
||||||
|
"data32 ljmp $0x10, $vga_ec_restart\n"
|
||||||
|
"vga_ec_restart:\n"
|
||||||
|
".code32\n"
|
||||||
|
" movw $0x18, %ax \n"
|
||||||
|
" mov %ax, %ds \n"
|
||||||
|
" mov %ax, %es \n"
|
||||||
|
" mov %ax, %fs \n"
|
||||||
|
" mov %ax, %gs \n"
|
||||||
|
" mov %ax, %ss \n"
|
||||||
|
".globl vga__ec_exit\n"
|
||||||
|
"vga_ec_exit:\n"
|
||||||
|
" mov __stack, %esp\n"
|
||||||
|
" popal\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
do_vgabios(void)
|
do_vgabios(void)
|
||||||
{
|
{
|
||||||
struct pci_dev *dev;
|
device_t dev;
|
||||||
unsigned long busdevfn;
|
unsigned long busdevfn;
|
||||||
unsigned int rom = 0;
|
unsigned int rom = 0;
|
||||||
unsigned char *buf;
|
unsigned char *buf;
|
||||||
@ -162,17 +255,17 @@ do_vgabios(void)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0x400; i<0x500; i++) {
|
for (i=0x400; i<0x500; i++) {
|
||||||
printk_debug("%02x%c", *(unsigned char *)i,
|
//printk_debug("%02x%c", *(unsigned char *)i,
|
||||||
i%16==15 ? '\n' : ' ');
|
// i%16==15 ? '\n' : ' ');
|
||||||
*(unsigned char *) i = 0;
|
*(unsigned char *) i = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0x400; i<0x500; i++) {
|
/* for (i=0x400; i<0x500; i++) {
|
||||||
printk_debug("%02x%c", *(unsigned char *)i,
|
printk_debug("%02x%c", *(unsigned char *)i,
|
||||||
i%16==15 ? '\n' : ' ');
|
i%16==15 ? '\n' : ' ');
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
dev = pci_find_class(PCI_CLASS_DISPLAY_VGA <<8, NULL);
|
dev = dev_find_class(PCI_CLASS_DISPLAY_VGA<<8 , 0);
|
||||||
|
|
||||||
if (! dev) {
|
if (! dev) {
|
||||||
printk_debug("NO VGA FOUND\n");
|
printk_debug("NO VGA FOUND\n");
|
||||||
@ -184,7 +277,7 @@ do_vgabios(void)
|
|||||||
// Use VGA BIOS blob at specified address
|
// Use VGA BIOS blob at specified address
|
||||||
rom = VGABIOS_START;
|
rom = VGABIOS_START;
|
||||||
#else
|
#else
|
||||||
pci_read_config32(dev, PCI_ROM_ADDRESS, &rom);
|
rom = pci_read_config32(dev, PCI_ROM_ADDRESS);
|
||||||
// paranoia
|
// paranoia
|
||||||
rom = 0xf0000000;
|
rom = 0xf0000000;
|
||||||
pci_write_config32(dev, PCI_ROM_ADDRESS, rom|1);
|
pci_write_config32(dev, PCI_ROM_ADDRESS, rom|1);
|
||||||
@ -193,12 +286,28 @@ do_vgabios(void)
|
|||||||
buf = (unsigned char *) rom;
|
buf = (unsigned char *) rom;
|
||||||
if ((buf[0] == 0x55) && (buf[1] == 0xaa)) {
|
if ((buf[0] == 0x55) && (buf[1] == 0xaa)) {
|
||||||
memcpy((void *) 0xc0000, buf, size);
|
memcpy((void *) 0xc0000, buf, size);
|
||||||
|
|
||||||
|
#define VGABIOS_WRITE_PROTECT 1
|
||||||
|
#ifdef VGABIOS_WRITE_PROTECT
|
||||||
|
write_protect_vgabios();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for(i = 0; i < 16; i++)
|
||||||
|
printk_debug("0x%x ", buf[i]);
|
||||||
|
// check signature again
|
||||||
|
buf = (unsigned char *) 0xc0000;
|
||||||
|
if (buf[0]==0x55 && buf[1]==0xAA) {
|
||||||
|
busdevfn = (dev->bus->secondary << 8) | dev->path.u.pci.devfn;
|
||||||
|
printk_debug("bus/devfn = %#x\n", busdevfn);
|
||||||
|
|
||||||
|
real_mode_switch_call_vga(busdevfn);
|
||||||
|
//for( i = 0 ; i < 0x500; i++){
|
||||||
|
// printk_debug("%02x%c",*(unsigned char *)i,
|
||||||
|
// i%16 == 15 ? '\n':' ');
|
||||||
|
//}
|
||||||
|
} else
|
||||||
|
printk_debug("Failed to copy VGA BIOS to 0xc0000\n");
|
||||||
|
|
||||||
for(i = 0; i < 16; i++)
|
|
||||||
printk_debug("0x%x ", buf[i]);
|
|
||||||
// check signature here later!
|
|
||||||
busdevfn = (dev->bus->secondary << 8) | dev->devfn;
|
|
||||||
real_mode_switch_call_vga(busdevfn);
|
|
||||||
} else
|
} else
|
||||||
printk_debug("BAD SIGNATURE 0x%x 0x%x\n", buf[0], buf[1]);
|
printk_debug("BAD SIGNATURE 0x%x 0x%x\n", buf[0], buf[1]);
|
||||||
#ifndef VGABIOS_START
|
#ifndef VGABIOS_START
|
||||||
@ -253,6 +362,10 @@ void callbiosint(void) {
|
|||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
".code16\n"
|
".code16\n"
|
||||||
"callbiosint16:\n"
|
"callbiosint16:\n"
|
||||||
|
" push %ds \n"
|
||||||
|
" push %es \n"
|
||||||
|
" push %fs \n"
|
||||||
|
" push %gs \n"
|
||||||
// clean up the int #. To save space we put it in the lower
|
// clean up the int #. To save space we put it in the lower
|
||||||
// byte. But the top 24 bits are junk.
|
// byte. But the top 24 bits are junk.
|
||||||
"andl $0xff, %eax\n"
|
"andl $0xff, %eax\n"
|
||||||
@ -277,8 +390,8 @@ void callbiosint(void) {
|
|||||||
" mov %ax, %ss \n"
|
" mov %ax, %ss \n"
|
||||||
" call biosint \n"
|
" call biosint \n"
|
||||||
// back to real mode ...
|
// back to real mode ...
|
||||||
" ljmp $0x28, $__rms_16bit\n"
|
" ljmp $0x28, $__rms_16bit2\n"
|
||||||
"__rms_16bit: \n"
|
"__rms_16bit2: \n"
|
||||||
".code16 \n" /* 16 bit code from here on... */
|
".code16 \n" /* 16 bit code from here on... */
|
||||||
|
|
||||||
/* Load the segment registers w/ properly configured segment
|
/* Load the segment registers w/ properly configured segment
|
||||||
@ -297,8 +410,8 @@ void callbiosint(void) {
|
|||||||
" movl %eax, %cr0 \n"
|
" movl %eax, %cr0 \n"
|
||||||
|
|
||||||
/* Now really going into real mode */
|
/* Now really going into real mode */
|
||||||
" ljmp $0, $__rms_real \n"
|
" ljmp $0, $__rms_real2 \n"
|
||||||
"__rms_real: \n"
|
"__rms_real2: \n"
|
||||||
|
|
||||||
/* Setup a stack */
|
/* Setup a stack */
|
||||||
" mov $0x0, %ax \n"
|
" mov $0x0, %ax \n"
|
||||||
@ -311,10 +424,16 @@ void callbiosint(void) {
|
|||||||
" mov %ax, %es \n"
|
" mov %ax, %es \n"
|
||||||
" mov %ax, %fs \n"
|
" mov %ax, %fs \n"
|
||||||
" mov %ax, %gs \n"
|
" mov %ax, %gs \n"
|
||||||
|
" mov $0x40, %ax \n"
|
||||||
|
" mov %ax, %ds \n"
|
||||||
// pop the INT # that you pushed earlier
|
// pop the INT # that you pushed earlier
|
||||||
" popl %eax\n"
|
" popl %eax\n"
|
||||||
" popal\n"
|
" pop %gs \n"
|
||||||
" iret\n"
|
" pop %fs \n"
|
||||||
|
" pop %es \n"
|
||||||
|
" pop %ds \n"
|
||||||
|
" popal\n"
|
||||||
|
" iret\n"
|
||||||
".code32\n"
|
".code32\n"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -336,12 +455,26 @@ pcibios(
|
|||||||
unsigned long *peax,
|
unsigned long *peax,
|
||||||
unsigned long *pflags
|
unsigned long *pflags
|
||||||
);
|
);
|
||||||
|
int
|
||||||
|
handleint21(
|
||||||
|
unsigned long *pedi,
|
||||||
|
unsigned long *pesi,
|
||||||
|
unsigned long *pebp,
|
||||||
|
unsigned long *pesp,
|
||||||
|
unsigned long *pebx,
|
||||||
|
unsigned long *pedx,
|
||||||
|
unsigned long *pecx,
|
||||||
|
unsigned long *peax,
|
||||||
|
unsigned long *pflags
|
||||||
|
);
|
||||||
|
|
||||||
extern void vga_exit(void);
|
extern void vga_exit(void);
|
||||||
|
|
||||||
int
|
int
|
||||||
biosint(
|
biosint(
|
||||||
unsigned long intnumber,
|
unsigned long intnumber,
|
||||||
|
unsigned long gsfs,
|
||||||
|
unsigned long dses,
|
||||||
unsigned long edi,
|
unsigned long edi,
|
||||||
unsigned long esi,
|
unsigned long esi,
|
||||||
unsigned long ebp,
|
unsigned long ebp,
|
||||||
@ -393,8 +526,12 @@ biosint(
|
|||||||
eax = 64 * 1024;
|
eax = 64 * 1024;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
|
case 0x15:
|
||||||
|
ret=handleint21( &edi, &esi, &ebp, &esp,
|
||||||
|
&ebx, &edx, &ecx, &eax, &flags);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printk_info(__FUNCTION__ ": Unsupport int #0x%x\n",
|
printk_info("BIOSINT: Unsupport int #0x%x\n",
|
||||||
intnumber);
|
intnumber);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -491,7 +628,7 @@ pcibios(
|
|||||||
unsigned short devid, vendorid, devfn;
|
unsigned short devid, vendorid, devfn;
|
||||||
short devindex; /* Use short to get rid of gabage in upper half of 32-bit register */
|
short devindex; /* Use short to get rid of gabage in upper half of 32-bit register */
|
||||||
unsigned char bus;
|
unsigned char bus;
|
||||||
struct pci_dev *dev;
|
device_t dev;
|
||||||
|
|
||||||
switch(func) {
|
switch(func) {
|
||||||
case CHECK:
|
case CHECK:
|
||||||
@ -505,7 +642,7 @@ pcibios(
|
|||||||
vendorid = *pedx;
|
vendorid = *pedx;
|
||||||
devindex = *pesi;
|
devindex = *pesi;
|
||||||
dev = 0;
|
dev = 0;
|
||||||
while ((dev = pci_find_device(vendorid, devid, dev))) {
|
while ((dev = dev_find_device(vendorid, devid, dev))) {
|
||||||
if (devindex <= 0)
|
if (devindex <= 0)
|
||||||
break;
|
break;
|
||||||
devindex--;
|
devindex--;
|
||||||
@ -516,7 +653,7 @@ pcibios(
|
|||||||
// busnum is an unsigned char;
|
// busnum is an unsigned char;
|
||||||
// devfn is an int, so we mask it off.
|
// devfn is an int, so we mask it off.
|
||||||
busdevfn = (dev->bus->secondary << 8)
|
busdevfn = (dev->bus->secondary << 8)
|
||||||
| (dev->devfn & 0xff);
|
| (dev->path.u.pci.devfn & 0xff);
|
||||||
printk_debug("0x%x: return 0x%x\n", func, busdevfn);
|
printk_debug("0x%x: return 0x%x\n", func, busdevfn);
|
||||||
*pebx = busdevfn;
|
*pebx = busdevfn;
|
||||||
retval = 0;
|
retval = 0;
|
||||||
@ -541,7 +678,7 @@ pcibios(
|
|||||||
devfn = *pebx & 0xff;
|
devfn = *pebx & 0xff;
|
||||||
bus = *pebx >> 8;
|
bus = *pebx >> 8;
|
||||||
reg = *pedi;
|
reg = *pedi;
|
||||||
dev = pci_find_slot(bus, devfn);
|
dev = dev_find_slot(bus, devfn);
|
||||||
if (! dev) {
|
if (! dev) {
|
||||||
printk_debug("0x%x: BAD DEVICE bus %d devfn 0x%x\n", func, bus, devfn);
|
printk_debug("0x%x: BAD DEVICE bus %d devfn 0x%x\n", func, bus, devfn);
|
||||||
// idiots. the pcibios guys assumed you'd never pass a bad bus/devfn!
|
// idiots. the pcibios guys assumed you'd never pass a bad bus/devfn!
|
||||||
@ -563,15 +700,15 @@ pcibios(
|
|||||||
break;
|
break;
|
||||||
case WRITECONFBYTE:
|
case WRITECONFBYTE:
|
||||||
byte = *pecx;
|
byte = *pecx;
|
||||||
write_config8(dev, reg, byte);
|
pci_write_config8(dev, reg, byte);
|
||||||
break;
|
break;
|
||||||
case WRITECONFWORD:
|
case WRITECONFWORD:
|
||||||
word = *pecx;
|
word = *pecx;
|
||||||
write_config16(dev, reg, word);
|
pci_write_config16(dev, reg, word);
|
||||||
break;
|
break;
|
||||||
case WRITECONFDWORD:
|
case WRITECONFDWORD:
|
||||||
word = *pecx;
|
dword = *pecx;
|
||||||
write_config32(dev, reg, dword);
|
pci_write_config32(dev, reg, dword);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -590,31 +727,46 @@ pcibios(
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vga_init(struct chip *chip, enum chip_pass pass)
|
|
||||||
{
|
|
||||||
|
|
||||||
struct pc80_vgabios_config *conf =
|
|
||||||
(struct pc80_vgabios_config *)chip->chip_info;
|
int handleint21( unsigned long *edi, unsigned long *esi, unsigned long *ebp,
|
||||||
|
unsigned long *esp, unsigned long *ebx, unsigned long *edx,
|
||||||
switch (pass) {
|
unsigned long *ecx, unsigned long *eax, unsigned long *flags)
|
||||||
case CONF_PASS_PRE_BOOT:
|
{
|
||||||
|
int res=-1;
|
||||||
|
switch(*eax&0xffff)
|
||||||
|
{
|
||||||
|
case 0x5f19:
|
||||||
break;
|
break;
|
||||||
|
case 0x5f18:
|
||||||
default:
|
*eax=0x5f;
|
||||||
/* nothing yet */
|
*ebx=0x545; // MCLK = 133, 32M frame buffer, 256 M main memory
|
||||||
|
// *ebx = 0x515; // MCLK = 133, 32M frame buffer, 128 M main memory
|
||||||
|
*ecx=0x060;
|
||||||
|
res=0;
|
||||||
|
break;
|
||||||
|
case 0x5f00:
|
||||||
|
*eax = 0x8600;
|
||||||
|
break;
|
||||||
|
case 0x5f01:
|
||||||
|
*eax = 0x5f;
|
||||||
|
*ecx = (*ecx & 0xffffff00 ) | 2; // panel type = 2 = 1024 * 768
|
||||||
|
res = 0;
|
||||||
|
break;
|
||||||
|
case 0x5f02:
|
||||||
|
*eax=0x5f;
|
||||||
|
*ebx= (*ebx & 0xffff0000) | 2;
|
||||||
|
*ecx= (*ecx & 0xffff0000) | 0x401; // PAL + crt only
|
||||||
|
*edx= (*edx & 0xffff0000) | 0; // TV Layout - default
|
||||||
|
res=0;
|
||||||
|
break;
|
||||||
|
case 0x5f0f:
|
||||||
|
*eax=0x860f;
|
||||||
|
//*ebx=0;
|
||||||
|
//*ecx=0;
|
||||||
|
//*edx=0;
|
||||||
|
//res=0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void enumerate(struct chip *chip)
|
|
||||||
{
|
|
||||||
/* don't really need to do anything */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
struct chip_control southbridge_via_vt8231_control = {
|
|
||||||
.enumerate = enumerate,
|
|
||||||
.enable = vga_init,
|
|
||||||
.name = "Legacy VGA bios"
|
|
||||||
};
|
|
||||||
|
2
src/southbridge/ricoh/rl5c476/Config.lb
Normal file
2
src/southbridge/ricoh/rl5c476/Config.lb
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
config chip.h
|
||||||
|
object rl5c476.o
|
10
src/southbridge/ricoh/rl5c476/chip.h
Normal file
10
src/southbridge/ricoh/rl5c476/chip.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#ifndef _SOUTHBRIDGE_RICOH_RL5C476
|
||||||
|
#define _SOUTHBRIDGE_RICOH_RL5C476
|
||||||
|
|
||||||
|
extern struct chip_control southbridge_ricoh_rl5c476_control;
|
||||||
|
|
||||||
|
struct southbridge_ricoh_rl5c476_config {
|
||||||
|
int num;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _SOUTHBRIDGE_RL5C476 */
|
255
src/southbridge/ricoh/rl5c476/rl5c476.c
Normal file
255
src/southbridge/ricoh/rl5c476/rl5c476.c
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
/*
|
||||||
|
* (C) Copyright 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., 59 Temple Place, Suite 330, Boston,
|
||||||
|
* MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <arch/io.h>
|
||||||
|
#include <device/device.h>
|
||||||
|
#include <device/pci.h>
|
||||||
|
#include <device/pci_ops.h>
|
||||||
|
#include <device/pci_ids.h>
|
||||||
|
#include <device/chip.h>
|
||||||
|
#include <console/console.h>
|
||||||
|
#include "rl5c476.h"
|
||||||
|
#include "chip.h"
|
||||||
|
|
||||||
|
static void udelay(int i){
|
||||||
|
for(; i > 0 ; i--)
|
||||||
|
inb(0x80);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dump_south(void)
|
||||||
|
{
|
||||||
|
device_t dev0;
|
||||||
|
dev0 = dev_find_device(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C476, 0);
|
||||||
|
dev0 = dev_find_device(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C476, dev0);
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
for(i = 0; i < 256; i += 16) {
|
||||||
|
printk_debug("0x%x: ", i);
|
||||||
|
for(j = 0; j < 16; j++) {
|
||||||
|
printk_debug("%02x ", pci_read_config8(dev0, i+j));
|
||||||
|
}
|
||||||
|
printk_debug("\n");
|
||||||
|
}
|
||||||
|
printk_debug("Card32\n");
|
||||||
|
for(i = 0 ; i < 256 ; i+=16){
|
||||||
|
printk_debug("0x%x: ",i);
|
||||||
|
for(j = 0 ; j < 16 ; j++){
|
||||||
|
printk_debug(" %02x",*(unsigned char *)(0x80000000+i+j));
|
||||||
|
}
|
||||||
|
printk_debug("\n");
|
||||||
|
}
|
||||||
|
printk_debug("Card16\n");
|
||||||
|
for(i = 0; i < 256; i += 16) {
|
||||||
|
printk_debug("0x%x: ", i);
|
||||||
|
for(j = 0; j < 16; j++) {
|
||||||
|
printk_debug("%02x ", *(unsigned char *)(0x80000800+ i+j));
|
||||||
|
}
|
||||||
|
printk_debug("\n");
|
||||||
|
}
|
||||||
|
printk_debug("CF Config\n");
|
||||||
|
for(i = 0 ; i < 256 ; i+=16){
|
||||||
|
printk_debug("0x%x: ",i);
|
||||||
|
for(j=0 ; j < 16 ; j++){
|
||||||
|
printk_debug("%02x ",*(unsigned char *)(0x81000200 + i + j));
|
||||||
|
}
|
||||||
|
printk_debug("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void rl5c476_init(struct southbridge_rl5c476_config *conf)
|
||||||
|
{
|
||||||
|
//unsigned char enables;
|
||||||
|
device_t dev;
|
||||||
|
pc16reg_t *pc16;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
printk_debug("rl5c476 init\n");
|
||||||
|
/* cardbus controller function 1 for CF Socket */
|
||||||
|
dev = dev_find_device(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C476, 0);
|
||||||
|
|
||||||
|
if (!dev ){
|
||||||
|
// probably an epia-m rather than mii
|
||||||
|
printk_debug("No rl5c476 found\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* setup pci header manually because 'pci_device.c' doesn't know how to handle
|
||||||
|
* pci to cardbus bridges - (header type 2 I think)
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* initialize function zero - pcmcia socket so it behaves itself */
|
||||||
|
/* FIXME - statically put control memory at 0xe0000000 for now
|
||||||
|
* one day the pci_device allocator might do this */
|
||||||
|
pci_write_config32(dev,0x10,0xe0000000);
|
||||||
|
pci_write_config8(dev,0x0d,0x20);
|
||||||
|
pci_write_config8(dev,0x19,0x02);
|
||||||
|
pci_write_config8(dev,0x1a,0x02);
|
||||||
|
pci_write_config8(dev,0x1b,0x20);
|
||||||
|
//pci_write_config8(dev,0x3c,0);
|
||||||
|
pci_write_config8(dev,0x82,0x00a0);
|
||||||
|
pci_write_config16(dev,0x04,0x07);
|
||||||
|
|
||||||
|
|
||||||
|
/* get second function - i.e. compact flash socket */
|
||||||
|
dev = dev_find_device(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C476, dev);
|
||||||
|
|
||||||
|
|
||||||
|
/* FIXME - control structure statically declared at 0xe0008000 for now */
|
||||||
|
pci_write_config32(dev,0x10,0xe0008000);
|
||||||
|
pci_write_config8(dev,0x0d,0x20);
|
||||||
|
pci_write_config8(dev,0x19,0x03);
|
||||||
|
pci_write_config8(dev,0x1a,0x03);
|
||||||
|
pci_write_config8(dev,0x1b,0x20);
|
||||||
|
|
||||||
|
//pci_write_config8(dev,0x3c,0x0);
|
||||||
|
pci_write_config16(dev,0x3e,0x0780);
|
||||||
|
pci_write_config16(dev,0x82,0x00a0);
|
||||||
|
|
||||||
|
pci_write_config16(dev,0x04,0x07);
|
||||||
|
|
||||||
|
|
||||||
|
/* pick up where 16 bit card control structure is */
|
||||||
|
pc16 = (pc16reg_t *)(0xe0008800);
|
||||||
|
|
||||||
|
/* disable memory and io windows and turn off socket power */
|
||||||
|
pc16->pwctrl = 0;
|
||||||
|
|
||||||
|
/* disable irq lines */
|
||||||
|
pc16->igctrl = 0;
|
||||||
|
|
||||||
|
/* disable memory and I/O windows */
|
||||||
|
pc16->awinen = 0;
|
||||||
|
|
||||||
|
/* reset card, configure for I/O and set IRQ line */
|
||||||
|
pc16->igctrl = 0x69;
|
||||||
|
|
||||||
|
|
||||||
|
// set io window 0 for 1e8 - 1ef
|
||||||
|
pc16->iostl0 = 0xe8;
|
||||||
|
pc16->iosth0 = 1;
|
||||||
|
|
||||||
|
pc16->iospl0 = 0xef;
|
||||||
|
pc16->iosph0 = 1;
|
||||||
|
|
||||||
|
// add io offset of 8 so that CF card will decode 0x1e8 as 0x1f0 i.e. the first byte of
|
||||||
|
// a 16 byte aligned, 16 byte window etc
|
||||||
|
pc16->ioffl0 = 0x8;
|
||||||
|
pc16->ioffh0 = 0;
|
||||||
|
|
||||||
|
// set io window 1 for 3ed - 3ee
|
||||||
|
pc16->iostl1 = 0xed;
|
||||||
|
pc16->iosth1 = 3;
|
||||||
|
|
||||||
|
pc16->iospl1 = 0xee;
|
||||||
|
pc16->iosph1 = 3;
|
||||||
|
|
||||||
|
pc16->ioffl1 = 0x0;
|
||||||
|
pc16->ioffh1 = 0;
|
||||||
|
|
||||||
|
|
||||||
|
// FIXME statically declare CF config window at 0xe1000000
|
||||||
|
pc16->smstl0 = 0;
|
||||||
|
pc16->smsth0 = 0;
|
||||||
|
pc16->smspl0 = 0;
|
||||||
|
pc16->smsph0 = 0x80;
|
||||||
|
pc16->moffl0 = 0;
|
||||||
|
pc16->moffh0 = 0x40;
|
||||||
|
pc16->smpga0 = 0xe1;
|
||||||
|
|
||||||
|
// set I/O width for Auto Data width
|
||||||
|
pc16->ioctrl = 0x22;
|
||||||
|
|
||||||
|
|
||||||
|
// enable I/O window 0 and 1
|
||||||
|
pc16->awinen = 0xc1;
|
||||||
|
|
||||||
|
|
||||||
|
pc16->miscc1 = 1;
|
||||||
|
|
||||||
|
// apply power and enable outputs
|
||||||
|
pc16->pwctrl = 0xb0;
|
||||||
|
|
||||||
|
|
||||||
|
// delay could be optimised, but this works
|
||||||
|
udelay(100000);
|
||||||
|
|
||||||
|
pc16->igctrl = 0x69;
|
||||||
|
|
||||||
|
unsigned char *cptr;
|
||||||
|
cptr = (unsigned char *)(0xe1000200);
|
||||||
|
printk_debug("CF Config = %x\n",*cptr);
|
||||||
|
|
||||||
|
// FIX Me 16 bit CF always have first config byte at 0x200 into Config structure,
|
||||||
|
// but CF+ May Not according to spec - should locate through reading tuple data,
|
||||||
|
// but this will do for now !!!
|
||||||
|
|
||||||
|
|
||||||
|
// set CF to decode 16 IO bytes on any 16 byte boundary - rely on the io
|
||||||
|
// windows of the bridge set up above to map those bytes into the
|
||||||
|
// addresses for ide controller 3 (0x1e8 - 0x1ef and 0x3ed - 0x3ee)
|
||||||
|
*cptr = 0x41;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void southbridge_init(struct chip *chip, enum chip_pass pass)
|
||||||
|
{
|
||||||
|
|
||||||
|
struct southbridge_rl5c476_config *conf =
|
||||||
|
(struct southbridge_rl5c476_config *)chip->chip_info;
|
||||||
|
|
||||||
|
switch (pass) {
|
||||||
|
case CONF_PASS_PRE_PCI:
|
||||||
|
//rl5c476_pci_enable(conf);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CONF_PASS_POST_PCI:
|
||||||
|
rl5c476_init(conf);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CONF_PASS_PRE_BOOT:
|
||||||
|
//dump_south();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* nothing yet */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void enumerate(struct chip *chip)
|
||||||
|
{
|
||||||
|
extern struct device_operations default_pci_ops_bus;
|
||||||
|
chip_enumerate(chip);
|
||||||
|
chip->dev->ops = &default_pci_ops_bus;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct chip_control southbridge_ricoh_rl5c476_control = {
|
||||||
|
.enumerate = enumerate,
|
||||||
|
.enable = southbridge_init,
|
||||||
|
.name = "RICOH RL5C476"
|
||||||
|
};
|
97
src/southbridge/ricoh/rl5c476/rl5c476.h
Normal file
97
src/southbridge/ricoh/rl5c476/rl5c476.h
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* (C) Copyright 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., 59 Temple Place, Suite 330, Boston,
|
||||||
|
* MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* rl5c476 routines and defines*/
|
||||||
|
|
||||||
|
|
||||||
|
typedef unsigned char u8;
|
||||||
|
|
||||||
|
|
||||||
|
/* the 16 bit control structure for ricoh cardbus bridge */
|
||||||
|
typedef struct pc16reg {
|
||||||
|
u8 idrevs;
|
||||||
|
u8 ifstat;
|
||||||
|
u8 pwctrl;
|
||||||
|
u8 igctrl;
|
||||||
|
u8 cschg;
|
||||||
|
u8 cscint;
|
||||||
|
u8 awinen;
|
||||||
|
u8 ioctrl;
|
||||||
|
u8 iostl0;
|
||||||
|
u8 iosth0;
|
||||||
|
u8 iospl0;
|
||||||
|
u8 iosph0;
|
||||||
|
u8 iostl1;
|
||||||
|
u8 iosth1;
|
||||||
|
u8 iospl1;
|
||||||
|
u8 iosph1;
|
||||||
|
u8 smstl0;
|
||||||
|
u8 smsth0;
|
||||||
|
u8 smspl0;
|
||||||
|
u8 smsph0;
|
||||||
|
u8 moffl0;
|
||||||
|
u8 moffh0;
|
||||||
|
u8 cdgenc;
|
||||||
|
u8 resv1;
|
||||||
|
u8 smstl1;
|
||||||
|
u8 smsth1;
|
||||||
|
u8 smspl1;
|
||||||
|
u8 smsph1;
|
||||||
|
u8 moffl1;
|
||||||
|
u8 moffh1;
|
||||||
|
u8 glctrl;
|
||||||
|
u8 atctrl;
|
||||||
|
u8 smstl2;
|
||||||
|
u8 smsth2;
|
||||||
|
u8 smspl2;
|
||||||
|
u8 smsph2;
|
||||||
|
u8 moffl2;
|
||||||
|
u8 moffh2;
|
||||||
|
u8 resv2;
|
||||||
|
u8 resv3;
|
||||||
|
u8 smstl3;
|
||||||
|
u8 smsth3;
|
||||||
|
u8 smspl3;
|
||||||
|
u8 smsph3;
|
||||||
|
u8 moffl3;
|
||||||
|
u8 moffh3;
|
||||||
|
u8 resv4;
|
||||||
|
u8 miscc1;
|
||||||
|
u8 smstl4;
|
||||||
|
u8 smsth4;
|
||||||
|
u8 smspl4;
|
||||||
|
u8 smsph4;
|
||||||
|
u8 moffl4;
|
||||||
|
u8 moffh4;
|
||||||
|
u8 ioffl0;
|
||||||
|
u8 ioffh0;
|
||||||
|
u8 ioffl1;
|
||||||
|
u8 ioffh1;
|
||||||
|
u8 gpio;
|
||||||
|
u8 resv5;
|
||||||
|
u8 resv6;
|
||||||
|
u8 resv7;
|
||||||
|
u8 resv8;
|
||||||
|
u8 resv9;
|
||||||
|
u8 smpga0;
|
||||||
|
} __attribute__ ((packed)) pc16reg_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -9,6 +9,8 @@
|
|||||||
#include "vt8235.h"
|
#include "vt8235.h"
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
|
void rtc_init(int i);
|
||||||
|
|
||||||
void pc_keyboard_init(void);
|
void pc_keyboard_init(void);
|
||||||
|
|
||||||
void hard_reset(void)
|
void hard_reset(void)
|
||||||
@ -23,67 +25,78 @@ static void usb_on(int enable)
|
|||||||
/* Base 8235 controller */
|
/* Base 8235 controller */
|
||||||
device_t dev0 = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, 0);
|
device_t dev0 = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, 0);
|
||||||
/* USB controller 1 */
|
/* USB controller 1 */
|
||||||
device_t dev2 = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, 0);
|
device_t dev1 = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, 0);
|
||||||
/* USB controller 2 */
|
/* USB controller 2 */
|
||||||
device_t dev3 = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, dev2);
|
device_t dev2 = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, dev1);
|
||||||
|
/* USB controller 2 */
|
||||||
|
device_t dev3 = dev_find_device(PCI_VENDOR_ID_VIA,
|
||||||
|
PCI_DEVICE_ID_VIA_82C586_2, dev2);
|
||||||
|
|
||||||
/* enable USB1 */
|
if(enable){
|
||||||
if(dev2) {
|
if(dev0) {
|
||||||
if (enable) {
|
regval = pci_read_config8(dev0, 0x50);
|
||||||
pci_write_config8(dev2, 0x3c, 0x05);
|
regval &= ~(0x36);
|
||||||
pci_write_config8(dev2, 0x04, 0x07);
|
pci_write_config8(dev0, 0x50, regval);
|
||||||
} else {
|
|
||||||
pci_write_config8(dev2, 0x3c, 0x00);
|
|
||||||
pci_write_config8(dev2, 0x04, 0x00);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/* enable USB1 */
|
||||||
if(dev0) {
|
if(dev1) {
|
||||||
regval = pci_read_config8(dev0, 0x50);
|
pci_write_config8(dev1, 0x04, 0x07);
|
||||||
if (enable)
|
}
|
||||||
regval &= ~(0x10);
|
|
||||||
else
|
/* enable USB2 */
|
||||||
regval |= 0x10;
|
if(dev2) {
|
||||||
pci_write_config8(dev0, 0x50, regval);
|
pci_write_config8(dev2, 0x04, 0x07);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* enable USB2 */
|
/* enable USB3 */
|
||||||
if(dev3) {
|
if(dev3) {
|
||||||
if (enable) {
|
pci_write_config8(dev3, 0x04, 0x07);
|
||||||
pci_write_config8(dev3, 0x3c, 0x05);
|
}
|
||||||
pci_write_config8(dev3, 0x04, 0x07);
|
|
||||||
} else {
|
}else{
|
||||||
pci_write_config8(dev3, 0x3c, 0x00);
|
if(dev0) {
|
||||||
pci_write_config8(dev3, 0x04, 0x00);
|
regval = pci_read_config8(dev0, 0x50);
|
||||||
|
regval |= 0x36;
|
||||||
|
pci_write_config8(dev0, 0x50, regval);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disable USB1 */
|
||||||
|
if(dev1) {
|
||||||
|
pci_write_config8(dev1, 0x3c, 0x00);
|
||||||
|
pci_write_config8(dev1, 0x04, 0x00);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disable USB2 */
|
||||||
|
if(dev2) {
|
||||||
|
pci_write_config8(dev2, 0x3c, 0x00);
|
||||||
|
pci_write_config8(dev2, 0x04, 0x00);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disable USB3 */
|
||||||
|
if(dev3) {
|
||||||
|
pci_write_config8(dev3, 0x3c, 0x00);
|
||||||
|
pci_write_config8(dev3, 0x04, 0x00);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if(dev0) {
|
|
||||||
regval = pci_read_config8(dev0, 0x50);
|
|
||||||
if (enable)
|
|
||||||
regval &= ~(0x20);
|
|
||||||
else
|
|
||||||
regval |= 0x20;
|
|
||||||
pci_write_config8(dev0, 0x50, regval);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void keyboard_on(void)
|
static void keyboard_on(void)
|
||||||
{
|
{
|
||||||
unsigned char regval;
|
unsigned char regval;
|
||||||
|
|
||||||
/* Base 8235 controller */
|
/* Base 8235 controller */
|
||||||
device_t dev0 = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, 0);
|
device_t dev0 = dev_find_device(PCI_VENDOR_ID_VIA, \
|
||||||
|
PCI_DEVICE_ID_VIA_8235, 0);
|
||||||
/* kevinh/Ispiri - update entire function to use
|
|
||||||
new pci_write_config8 */
|
|
||||||
|
|
||||||
if (dev0) {
|
if (dev0) {
|
||||||
regval = pci_read_config8(dev0, 0x51);
|
regval = pci_read_config8(dev0, 0x51);
|
||||||
regval |= 0x0f;
|
// regval |= 0x0f;
|
||||||
|
/* !!!FIX let's try this */
|
||||||
|
regval |= 0x1d;
|
||||||
pci_write_config8(dev0, 0x51, regval);
|
pci_write_config8(dev0, 0x51, regval);
|
||||||
}
|
}
|
||||||
init_pc_keyboard(0x60, 0x64, 0);
|
pc_keyboard_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nvram_on(void)
|
static void nvram_on(void)
|
||||||
@ -152,16 +165,43 @@ static void vt8235_pci_enable(struct southbridge_via_vt8235_config *conf)
|
|||||||
*/
|
*/
|
||||||
void pci_assign_irqs(unsigned bus, unsigned slot, const unsigned char pIntAtoD[4]);
|
void pci_assign_irqs(unsigned bus, unsigned slot, const unsigned char pIntAtoD[4]);
|
||||||
|
|
||||||
|
/* taken some liberties - changed irq structures to pins numbers so that it is easier to
|
||||||
|
* change PCI irq assignments without having to change each PCI function individually
|
||||||
|
*/
|
||||||
|
|
||||||
static const unsigned char southbridgeIrqs[4] = { 11, 5, 10, 12 };
|
/* pciIrqs contains the irqs assigned for PCI pins A-D */
|
||||||
static const unsigned char enetIrqs[4] = { 11, 5, 10, 12 };
|
/* setting will depend on motherboard as irqs can be quite scarce */
|
||||||
static const unsigned char slotIrqs[4] = { 5, 10, 12, 11 };
|
/* e.g on EPIA-MII, 16 bit CF card wants a dedicated IRQ. A 16 bit card in pcmcia socket */
|
||||||
|
/* may want another - for now only claim 3 interupts for PCI, leaving at least one spare */
|
||||||
|
/* for CF. */
|
||||||
|
/* On EPIA-M one could allocated all four irqs to different numbers since there are no cardbus */
|
||||||
|
/* devices */
|
||||||
|
|
||||||
|
|
||||||
|
static const unsigned char pciIrqs[4] = { 5 , 9 , 9, 10 };
|
||||||
|
|
||||||
|
static const unsigned char usbPins[4] = { 'A','B','C','D'};
|
||||||
|
static const unsigned char enetPins[4] = { 'A','B','C','D'};
|
||||||
|
static const unsigned char slotPins[4] = { 'B','C','D','A'};
|
||||||
|
static const unsigned char firewirePins[4] = { 'B','C','D','A'};
|
||||||
|
static const unsigned char vt8235Pins[4] = { 'A','B','C','D'};
|
||||||
|
static const unsigned char vgaPins[4] = { 'A','B','C','D'};
|
||||||
|
static const unsigned char cbPins[4] = { 'A','B','C','D'};
|
||||||
|
static const unsigned char riserPins[4] = { 'A','B','C','D'};
|
||||||
/*
|
/*
|
||||||
Our IDSEL mappings are as follows
|
Our IDSEL mappings are as follows
|
||||||
PCI slot is AD31 (device 15) (00:14.0)
|
PCI slot is AD31 (device 15) (00:14.0)
|
||||||
Southbridge is AD28 (device 12) (00:11.0)
|
Southbridge is AD28 (device 12) (00:11.0)
|
||||||
*/
|
*/
|
||||||
|
static unsigned char *pin_to_irq(const unsigned char *pin)
|
||||||
|
{
|
||||||
|
static unsigned char Irqs[4];
|
||||||
|
int i;
|
||||||
|
for (i = 0 ; i < 4 ; i++)
|
||||||
|
Irqs[i] = pciIrqs[ pin[i] - 'A' ];
|
||||||
|
|
||||||
|
return Irqs;
|
||||||
|
}
|
||||||
static void pci_routing_fixup(void)
|
static void pci_routing_fixup(void)
|
||||||
{
|
{
|
||||||
device_t dev;
|
device_t dev;
|
||||||
@ -177,23 +217,47 @@ static void pci_routing_fixup(void)
|
|||||||
PINTC = IRQ10
|
PINTC = IRQ10
|
||||||
PINTD = IRQ12
|
PINTD = IRQ12
|
||||||
*/
|
*/
|
||||||
pci_write_config8(dev, 0x55, 0xb0);
|
pci_write_config8(dev, 0x55, pciIrqs[0] << 4);
|
||||||
pci_write_config8(dev, 0x56, 0xa5);
|
pci_write_config8(dev, 0x56, pciIrqs[1] | (pciIrqs[2] << 4) );
|
||||||
pci_write_config8(dev, 0x57, 0xc0);
|
pci_write_config8(dev, 0x57, pciIrqs[3] << 4);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Standard southbridge components
|
|
||||||
printk_info("setting southbridge\n");
|
|
||||||
pci_assign_irqs(0, 0x11, southbridgeIrqs);
|
// firewire built into southbridge
|
||||||
|
printk_info("setting firewire\n");
|
||||||
|
pci_assign_irqs(0, 0x0d, pin_to_irq(firewirePins) );
|
||||||
|
|
||||||
|
// Standard usb components
|
||||||
|
printk_info("setting usb\n");
|
||||||
|
pci_assign_irqs(0, 0x10, pin_to_irq(usbPins) );
|
||||||
|
|
||||||
|
// VT8235 + sound hardware
|
||||||
|
printk_info("setting vt8235\n");
|
||||||
|
pci_assign_irqs(0, 0x11, pin_to_irq(vt8235Pins) );
|
||||||
|
|
||||||
// Ethernet built into southbridge
|
// Ethernet built into southbridge
|
||||||
printk_info("setting ethernet\n");
|
printk_info("setting ethernet\n");
|
||||||
pci_assign_irqs(0, 0x12, enetIrqs);
|
pci_assign_irqs(0, 0x12, pin_to_irq(enetPins) );
|
||||||
|
|
||||||
|
// VGA
|
||||||
|
printk_info("setting vga\n");
|
||||||
|
pci_assign_irqs(1, 0x00, pin_to_irq(vgaPins) );
|
||||||
|
|
||||||
// PCI slot
|
// PCI slot
|
||||||
printk_info("setting pci slot\n");
|
printk_info("setting pci slot\n");
|
||||||
pci_assign_irqs(0, 0x14, slotIrqs);
|
pci_assign_irqs(0, 0x14, pin_to_irq(slotPins) );
|
||||||
printk_info("%s: DONE\n", __FUNCTION__);
|
|
||||||
|
// Cardbus slot
|
||||||
|
printk_info("setting cardbus slot\n");
|
||||||
|
pci_assign_irqs(0, 0x0a, pin_to_irq(cbPins) );
|
||||||
|
|
||||||
|
// Via 2 slot riser card 2nd slot
|
||||||
|
printk_info("setting riser slot\n");
|
||||||
|
pci_assign_irqs(0, 0x13, pin_to_irq(riserPins) );
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -213,13 +277,76 @@ dump_south(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_led(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
// set power led to steady now that lxbios has virtually done its job
|
||||||
|
device_t dev0;
|
||||||
|
dev0 = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235,0);
|
||||||
|
|
||||||
|
pci_write_config8(dev0,0x94,0xb0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set up the power management capabilities directly into ACPI mode */
|
||||||
|
/* this avoids having to handle any System Management Interrupts (SMI's) which I can't */
|
||||||
|
/* figure out how to do !!!! */
|
||||||
|
|
||||||
|
void setup_pm(device_t dev0)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Set gen config 0
|
||||||
|
pci_write_config8(dev0,0x80,0x20);
|
||||||
|
|
||||||
|
// Set ACPI base address to IO 0x4000
|
||||||
|
pci_write_config16(dev0, 0x88, 0x0401);
|
||||||
|
|
||||||
|
// set ACPI irq to 5
|
||||||
|
pci_write_config8(dev0,0x82,0x55);
|
||||||
|
|
||||||
|
// primary interupt channel
|
||||||
|
pci_write_config16(dev0,0x84,0x30f2);
|
||||||
|
|
||||||
|
// throttle / stop clock control
|
||||||
|
pci_write_config8(dev0,0x8d,0x18);
|
||||||
|
|
||||||
|
pci_write_config8(dev0,0x93,0x88);
|
||||||
|
//pci_write_config8(dev0,0x94,0xb0);
|
||||||
|
pci_write_config8(dev0,0x95,0xc0);
|
||||||
|
pci_write_config8(dev0,0x98,0);
|
||||||
|
pci_write_config8(dev0,0x99,0xea);
|
||||||
|
pci_write_config8(dev0,0xe4,0x14);
|
||||||
|
pci_write_config8(dev0,0xe5,0x08);
|
||||||
|
|
||||||
|
|
||||||
|
// Enable ACPI access (and setup like award)
|
||||||
|
pci_write_config8(dev0, 0x81, 0x84);
|
||||||
|
|
||||||
|
outw(0xffff,0x400);
|
||||||
|
outw(0xffff,0x420);
|
||||||
|
outw(0xffff,0x428);
|
||||||
|
outl(0xffffffff,0x430);
|
||||||
|
|
||||||
|
outw(0x0,0x424);
|
||||||
|
outw(0x0,0x42a);
|
||||||
|
outw(0x1,0x42c);
|
||||||
|
outl(0x0,0x434);
|
||||||
|
outl(0x01,0x438);
|
||||||
|
outb(0x0,0x442);
|
||||||
|
outl(0xffff7fff,0x448);
|
||||||
|
outw(0x001,0x404);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static void vt8235_init(struct southbridge_via_vt8235_config *conf)
|
static void vt8235_init(struct southbridge_via_vt8235_config *conf)
|
||||||
{
|
{
|
||||||
unsigned char enables;
|
unsigned char enables;
|
||||||
device_t dev0;
|
device_t dev0;
|
||||||
device_t dev1;
|
device_t dev1;
|
||||||
device_t devpwr;
|
//device_t devpwr;
|
||||||
|
//int i;
|
||||||
|
|
||||||
// to do: use the pcibios_find function here, instead of
|
// to do: use the pcibios_find function here, instead of
|
||||||
// hard coding the devfn.
|
// hard coding the devfn.
|
||||||
// done - kevinh/Ispiri
|
// done - kevinh/Ispiri
|
||||||
@ -243,6 +370,7 @@ static void vt8235_init(struct southbridge_via_vt8235_config *conf)
|
|||||||
// IMPORTANT FIX - EISA 0x4d0 decoding must be on so that PCI
|
// IMPORTANT FIX - EISA 0x4d0 decoding must be on so that PCI
|
||||||
// interrupts can be properly marked as level triggered.
|
// interrupts can be properly marked as level triggered.
|
||||||
enables = pci_read_config8(dev0, 0x40);
|
enables = pci_read_config8(dev0, 0x40);
|
||||||
|
enables |= 0x45;
|
||||||
pci_write_config8(dev0, 0x40, enables);
|
pci_write_config8(dev0, 0x40, enables);
|
||||||
|
|
||||||
// Set 0x42 to 0xf0 to match Award bios
|
// Set 0x42 to 0xf0 to match Award bios
|
||||||
@ -250,6 +378,17 @@ static void vt8235_init(struct southbridge_via_vt8235_config *conf)
|
|||||||
enables |= 0xf0;
|
enables |= 0xf0;
|
||||||
pci_write_config8(dev0, 0x42, enables);
|
pci_write_config8(dev0, 0x42, enables);
|
||||||
|
|
||||||
|
|
||||||
|
/* Set 0x58 to 0x03 to match Award */
|
||||||
|
pci_write_config8(dev0, 0x58, 0x03);
|
||||||
|
|
||||||
|
/* Set bit 3 of 0x4f to match award (use INIT# as cpu reset) */
|
||||||
|
enables = pci_read_config8(dev0, 0x4f);
|
||||||
|
enables |= 0x08;
|
||||||
|
pci_write_config8(dev0, 0x4f, enables);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Set bit 3 of 0x4a, to match award (dummy pci request)
|
// Set bit 3 of 0x4a, to match award (dummy pci request)
|
||||||
enables = pci_read_config8(dev0, 0x4a);
|
enables = pci_read_config8(dev0, 0x4a);
|
||||||
enables |= 0x08;
|
enables |= 0x08;
|
||||||
@ -271,67 +410,23 @@ static void vt8235_init(struct southbridge_via_vt8235_config *conf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// enable com1 and com2.
|
/* enable serial irq */
|
||||||
if (conf->enable_com_ports) {
|
pci_write_config8(dev0,0x52,0x9);
|
||||||
enables = pci_read_config8(dev0, 0x6e);
|
|
||||||
|
/* dma */
|
||||||
/* 0x80 is enable com port b, 0x10 is to make it com2, 0x8
|
pci_write_config8(dev0, 0x53, 0x00);
|
||||||
* is enable com port a as com1 kevinh/Ispiri - Old code
|
|
||||||
* thought 0x01 would make it com1, that was wrong enables =
|
/* Use compatability mode - per award bios */
|
||||||
* 0x80 | 0x10 | 0x8 ; pci_write_config8(dev0, 0x6e,
|
pci_write_config32(dev1, 0x10, 0x0);
|
||||||
* enables); // note: this is also a redo of some port of
|
pci_write_config32(dev1, 0x14, 0x0);
|
||||||
* assembly, but we want everything up.
|
pci_write_config32(dev1, 0x18, 0x0);
|
||||||
*/
|
pci_write_config32(dev1, 0x1c, 0x0);
|
||||||
|
|
||||||
/* set com1 to 115 kbaud not clear how to do this yet.
|
|
||||||
* forget it; done in assembly.
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
|
||||||
// enable IDE, since Linux won't do it.
|
|
||||||
// First do some more things to devfn (17,0)
|
|
||||||
// note: this should already be cleared, according to the book.
|
|
||||||
enables = pci_read_config8(dev0, 0x50);
|
|
||||||
printk_debug("IDE enable in reg. 50 is 0x%x\n", enables);
|
|
||||||
enables &= ~8; // need manifest constant here!
|
|
||||||
printk_debug("set IDE reg. 50 to 0x%x\n", enables);
|
|
||||||
pci_write_config8(dev0, 0x50, enables);
|
|
||||||
|
|
||||||
// set default interrupt values (IDE)
|
|
||||||
enables = pci_read_config8(dev0, 0x4c);
|
|
||||||
printk_debug("IRQs in reg. 4c are 0x%x\n", enables & 0xf);
|
|
||||||
// clear out whatever was there.
|
|
||||||
enables &= ~0xf;
|
|
||||||
enables |= 4;
|
|
||||||
printk_debug("setting reg. 4c to 0x%x\n", enables);
|
|
||||||
pci_write_config8(dev0, 0x4c, enables);
|
|
||||||
|
|
||||||
// set up the serial port interrupts.
|
|
||||||
// com2 to 3, com1 to 4
|
|
||||||
pci_write_config8(dev0, 0x46, 0x04);
|
|
||||||
pci_write_config8(dev0, 0x47, 0x03);
|
|
||||||
pci_write_config8(dev0, 0x6e, 0x98);
|
|
||||||
//
|
|
||||||
// Power management setup
|
// Power management setup
|
||||||
|
setup_pm(dev0);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Set ACPI base address to IO 0x4000
|
|
||||||
//pci_write_config32(devpwr, 0x48, 0x4001);
|
|
||||||
|
|
||||||
// Enable ACPI access (and setup like award)
|
|
||||||
//pci_write_config8(devpwr, 0x41, 0x84);
|
|
||||||
|
|
||||||
// Set hardware monitor base address to IO 0x6000
|
|
||||||
//pci_write_config32(devpwr, 0x70, 0x6001);
|
|
||||||
|
|
||||||
// Enable hardware monitor (and setup like award)
|
|
||||||
//pci_write_config8(devpwr, 0x74, 0x01);
|
|
||||||
|
|
||||||
// set IO base address to 0x5000
|
|
||||||
//pci_write_config32(devpwr, 0x90, 0x5001);
|
|
||||||
|
|
||||||
// Enable SMBus
|
|
||||||
//pci_write_config8(devpwr, 0xd2, 0x01);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// IDE setup
|
// IDE setup
|
||||||
//
|
//
|
||||||
@ -422,6 +517,8 @@ static void vt8235_init(struct southbridge_via_vt8235_config *conf)
|
|||||||
|
|
||||||
// Start the rtc
|
// Start the rtc
|
||||||
rtc_init(0);
|
rtc_init(0);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void southbridge_init(struct chip *chip, enum chip_pass pass)
|
static void southbridge_init(struct chip *chip, enum chip_pass pass)
|
||||||
@ -436,12 +533,23 @@ static void southbridge_init(struct chip *chip, enum chip_pass pass)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CONF_PASS_POST_PCI:
|
case CONF_PASS_POST_PCI:
|
||||||
|
/* initialise the PIC - particularly so that VGA bios init code
|
||||||
|
doesn't get nasty unknown interupt vectors when it tries to establish
|
||||||
|
its interrupts. */
|
||||||
|
setup_i8259();
|
||||||
vt8235_init(conf);
|
vt8235_init(conf);
|
||||||
pci_routing_fixup();
|
pci_routing_fixup();
|
||||||
|
usb_on(1);
|
||||||
|
keyboard_on();
|
||||||
|
vga_fixup();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CONF_PASS_PRE_BOOT:
|
case CONF_PASS_PRE_BOOT:
|
||||||
dump_south();
|
dump_south();
|
||||||
|
set_led();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -29,35 +29,64 @@ static void enable_smbus(void)
|
|||||||
{
|
{
|
||||||
device_t dev;
|
device_t dev;
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
|
int i;
|
||||||
/* Power management controller */
|
/* Power management controller */
|
||||||
dev = pci_locate_device(PCI_ID(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235), 0);
|
dev = pci_locate_device(PCI_ID(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235), 0);
|
||||||
|
|
||||||
if (dev == PCI_DEV_INVALID) {
|
if (dev == PCI_DEV_INVALID) {
|
||||||
die("SMBUS controller not found\r\n");
|
die("SMBUS controller not found\r\n");
|
||||||
}
|
}
|
||||||
|
pci_write_config8(dev, 0xd2, (0x4 << 1 ));
|
||||||
|
|
||||||
// set IO base address to SMBUS_IO_BASE
|
// set IO base address to SMBUS_IO_BASE
|
||||||
pci_write_config32(dev, 0x90, SMBUS_IO_BASE|1);
|
pci_write_config16(dev, 0xd0, SMBUS_IO_BASE);
|
||||||
|
|
||||||
// Enable SMBus
|
// Enable SMBus
|
||||||
pci_write_config8(dev, 0xd2, (0x4 << 1)|1);
|
pci_write_config8(dev, 0xd2, (0x4 << 1)|1);
|
||||||
|
|
||||||
|
// Enable RTC
|
||||||
|
pci_write_config8(dev,0x51,0x04);
|
||||||
|
|
||||||
/* make it work for I/O ...
|
/* make it work for I/O ...
|
||||||
*/
|
*/
|
||||||
pci_write_config8(dev, 4, 1);
|
pci_write_config16(dev, 4, 1);
|
||||||
|
|
||||||
|
|
||||||
|
/* tell the world we're alive - make power led flash during bios execution */
|
||||||
|
pci_write_config8(dev,0x94,0xb2);
|
||||||
|
|
||||||
|
|
||||||
|
/* FIX for half baud rate problem */
|
||||||
|
/* let clocks and the like settle */
|
||||||
|
/* as yet arbitrary count - 1000 is too little 5000 works */
|
||||||
|
for(i = 0 ; i < 5000 ; i++)
|
||||||
|
outb(0x80,0x80);
|
||||||
|
|
||||||
|
/* southbridge doesn't seem to like to do much untill after this delay, so set up
|
||||||
|
* the flashing power LED again */
|
||||||
|
pci_write_config8(dev,0x94,0xb2);
|
||||||
|
|
||||||
/* The VT1211 serial port needs 48 mhz clock, on power up it is getting
|
/* The VT1211 serial port needs 48 mhz clock, on power up it is getting
|
||||||
only 24 mhz, there is some mysterious device on the smbus that can
|
only 24 mhz, there is some mysterious device on the smbus that can
|
||||||
fix this...this code below does it. */
|
fix this...this code below does it. */
|
||||||
outb(0xff, SMBUS_IO_BASE+SMBHSTSTAT);
|
outb(0xff, SMBUS_IO_BASE+SMBHSTSTAT);
|
||||||
|
outb(0xff, SMBUS_IO_BASE+SMBHSTSTAT);
|
||||||
|
outb(0xff, SMBUS_IO_BASE+SMBHSTSTAT);
|
||||||
|
outb(0xff, SMBUS_IO_BASE+SMBHSTSTAT);
|
||||||
|
for( ;;) {
|
||||||
|
c = inb(SMBUS_IO_BASE+SMBHSTSTAT);
|
||||||
|
if ((c & 1) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
outb(0x7f, SMBUS_IO_BASE+SMBHSTDAT0);
|
outb(0x7f, SMBUS_IO_BASE+SMBHSTDAT0);
|
||||||
outb(0x83, SMBUS_IO_BASE+SMBHSTCMD);
|
outb(0x83, SMBUS_IO_BASE+SMBHSTCMD);
|
||||||
outb(CLOCK_SLAVE_ADDRESS<<1, SMBUS_IO_BASE+SMBXMITADD);
|
outb(CLOCK_SLAVE_ADDRESS<<1 , SMBUS_IO_BASE+SMBXMITADD);
|
||||||
outb(8 | I2C_TRANS_CMD, SMBUS_IO_BASE+SMBHSTCTL);
|
outb(8 | I2C_TRANS_CMD, SMBUS_IO_BASE+SMBHSTCTL);
|
||||||
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
c = inb(SMBUS_IO_BASE+SMBHSTSTAT);
|
c = inb(SMBUS_IO_BASE+SMBHSTSTAT);
|
||||||
if (c & 1 == 0)
|
if ((c & 1) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -173,8 +202,9 @@ static unsigned char smbus_read_byte(unsigned char devAdr,
|
|||||||
|
|
||||||
/* SMBUS Wait Ready */
|
/* SMBUS Wait Ready */
|
||||||
for ( i = 0; i < 0xFFFF; i++ )
|
for ( i = 0; i < 0xFFFF; i++ )
|
||||||
if ( ((sts = inb(SMBUS_IO_BASE)) & 0x01) == 0 )
|
if ( ((sts = (inb(SMBUS_IO_BASE) & 0x1f)) & 0x01) == 0 )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if ((sts & ~3) != 0) {
|
if ((sts & ~3) != 0) {
|
||||||
smbus_print_error(sts);
|
smbus_print_error(sts);
|
||||||
return 0;
|
return 0;
|
||||||
|
2
src/superio/via/vt1211/Config.lb
Normal file
2
src/superio/via/vt1211/Config.lb
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
config chip.h
|
||||||
|
object vt1211.o
|
19
src/superio/via/vt1211/chip.h
Normal file
19
src/superio/via/vt1211/chip.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#ifndef _SUPERIO_VIA_VT1211
|
||||||
|
#define _SUPERIO_VIA_VT1211
|
||||||
|
|
||||||
|
extern struct chip_control superio_via_vt1211_control;
|
||||||
|
|
||||||
|
struct superio_via_vt1211_config {
|
||||||
|
/* PCI function enables */
|
||||||
|
/* i.e. so that pci scan bus will find them. */
|
||||||
|
/* I am putting in IDE as an example but obviously this needs
|
||||||
|
* to be more complete!
|
||||||
|
*/
|
||||||
|
/* enables of functions of devices */
|
||||||
|
int enable_com_ports;
|
||||||
|
int enable_fdc;
|
||||||
|
int enable_lpt;
|
||||||
|
int enable_hwmon;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _SUPERIO_VIA_VT1211 */
|
149
src/superio/via/vt1211/vt1211.c
Normal file
149
src/superio/via/vt1211/vt1211.c
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/*
|
||||||
|
* (C) Copyright 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., 59 Temple Place, Suite 330, Boston,
|
||||||
|
* MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* vt1211 routines and defines*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <arch/io.h>
|
||||||
|
#include <device/device.h>
|
||||||
|
#include <device/pci.h>
|
||||||
|
#include <device/pci_ops.h>
|
||||||
|
#include <device/pci_ids.h>
|
||||||
|
#include <device/chip.h>
|
||||||
|
#include <console/console.h>
|
||||||
|
#include "vt1211.h"
|
||||||
|
#include "chip.h"
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned char vt1211hwmonitorinits[]={
|
||||||
|
0x10,0x3, 0x11,0x10, 0x12,0xd, 0x13,0x7f,
|
||||||
|
0x14,0x21, 0x15,0x81, 0x16,0xbd, 0x17,0x8a,
|
||||||
|
0x18,0x0, 0x19,0x0, 0x1a,0x0, 0x1b,0x0,
|
||||||
|
0x1d,0xff, 0x1e,0x0, 0x1f,0x73, 0x20,0x67,
|
||||||
|
0x21,0xc1, 0x22,0xca, 0x23,0x74, 0x24,0xc2,
|
||||||
|
0x25,0xc7, 0x26,0xc9, 0x27,0x7f, 0x29,0x0,
|
||||||
|
0x2a,0x0, 0x2b,0xff, 0x2c,0x0, 0x2d,0xff,
|
||||||
|
0x2e,0x0, 0x2f,0xff, 0x30,0x0, 0x31,0xff,
|
||||||
|
0x32,0x0, 0x33,0xff, 0x34,0x0, 0x39,0xff,
|
||||||
|
0x3a,0x0, 0x3b,0xff, 0x3c,0xff, 0x3d,0xff,
|
||||||
|
0x3e,0x0, 0x3f,0xb0, 0x43,0xff, 0x44,0xff,
|
||||||
|
0x46,0xff, 0x47,0x50, 0x4a,0x3, 0x4b,0xc0,
|
||||||
|
0x4c,0x0, 0x4d,0x0, 0x4e,0xf, 0x5d,0x77,
|
||||||
|
0x5c,0x0, 0x5f,0x33, 0x40,0x1};
|
||||||
|
|
||||||
|
static void start_conf_pnp(int dev)
|
||||||
|
{
|
||||||
|
outb(0x87,0x2e);
|
||||||
|
outb(0x87,0x2e);
|
||||||
|
outb(7,0x2e);
|
||||||
|
outb(dev,0x2f);
|
||||||
|
}
|
||||||
|
static void write_pnp(int reg, int val)
|
||||||
|
{
|
||||||
|
outb(reg,0x2e);
|
||||||
|
outb(val,0x2f);
|
||||||
|
}
|
||||||
|
static void end_conf_pnp()
|
||||||
|
{
|
||||||
|
outb(0xaa,0x2e);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void vt1211_init(struct superio_via_vt1211_config *conf)
|
||||||
|
{
|
||||||
|
|
||||||
|
int i;
|
||||||
|
// Activate the vt1211 hardware monitor
|
||||||
|
if(conf->enable_hwmon){
|
||||||
|
start_conf_pnp(0x0b);
|
||||||
|
write_pnp(0x60,0xec);
|
||||||
|
write_pnp(0x30,1);
|
||||||
|
end_conf_pnp();
|
||||||
|
|
||||||
|
// initialize vt1211 hardware monitor registers, which are at 0xECXX
|
||||||
|
for(i=0;i<sizeof(vt1211hwmonitorinits);i+=2)
|
||||||
|
outb(vt1211hwmonitorinits[i+1],0xec00+vt1211hwmonitorinits[i]);
|
||||||
|
}
|
||||||
|
if( conf->enable_fdc){
|
||||||
|
// activate FDC
|
||||||
|
start_conf_pnp(0); // fdc is device 0
|
||||||
|
write_pnp(0x60,0xfc); // io address
|
||||||
|
write_pnp(0x70,0x06); // interupt
|
||||||
|
write_pnp(0x74,0x02); // dma
|
||||||
|
write_pnp(0x30,0x01); // activate it
|
||||||
|
end_conf_pnp();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( conf->enable_com_ports ){
|
||||||
|
// activate com2
|
||||||
|
start_conf_pnp(3);
|
||||||
|
write_pnp(0x60,0xbe);
|
||||||
|
write_pnp(0x70,0x3);
|
||||||
|
write_pnp(0xf0,0x02);
|
||||||
|
write_pnp(0x30,0x01);
|
||||||
|
end_conf_pnp();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( conf->enable_lpt ){
|
||||||
|
// activate lpt
|
||||||
|
start_conf_pnp(1);
|
||||||
|
write_pnp(0x60,0xde);
|
||||||
|
write_pnp(0x70,0x07);
|
||||||
|
write_pnp(0x74,0x3);
|
||||||
|
write_pnp(0x30,0x01);
|
||||||
|
end_conf_pnp();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void superio_init(struct chip *chip, enum chip_pass pass)
|
||||||
|
{
|
||||||
|
|
||||||
|
struct superio_via_vt1211_config *conf =
|
||||||
|
(struct superio_via_vt1211_config *)chip->chip_info;
|
||||||
|
|
||||||
|
switch (pass) {
|
||||||
|
case CONF_PASS_PRE_PCI:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CONF_PASS_POST_PCI:
|
||||||
|
vt1211_init(conf);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CONF_PASS_PRE_BOOT:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* nothing yet */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void enumerate(struct chip *chip)
|
||||||
|
{
|
||||||
|
extern struct device_operations default_pci_ops_bus;
|
||||||
|
chip_enumerate(chip);
|
||||||
|
chip->dev->ops = &default_pci_ops_bus;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct chip_control superio_via_vt1211_control = {
|
||||||
|
.enumerate = enumerate,
|
||||||
|
.enable = superio_init,
|
||||||
|
.name = "VIA vt1211"
|
||||||
|
};
|
22
src/superio/via/vt1211/vt1211.h
Normal file
22
src/superio/via/vt1211/vt1211.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* (C) Copyright 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., 59 Temple Place, Suite 330, Boston,
|
||||||
|
* MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* vt1211 routines and defines*/
|
||||||
|
|
107
targets/via/epia-m/Config.etherboot.lb
Normal file
107
targets/via/epia-m/Config.etherboot.lb
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
# Sample config file for EPIA-M
|
||||||
|
# This will make a target directory of ./epia-m
|
||||||
|
|
||||||
|
loadoptions
|
||||||
|
|
||||||
|
target epia-m
|
||||||
|
|
||||||
|
uses ARCH
|
||||||
|
uses CONFIG_COMPRESS
|
||||||
|
uses CONFIG_IOAPIC
|
||||||
|
uses CONFIG_ROM_STREAM
|
||||||
|
uses CONFIG_ROM_STREAM_START
|
||||||
|
uses CONFIG_UDELAY_TSC
|
||||||
|
uses CPU_FIXUP
|
||||||
|
uses FALLBACK_SIZE
|
||||||
|
uses HAVE_FALLBACK_BOOT
|
||||||
|
uses HAVE_MP_TABLE
|
||||||
|
uses HAVE_PIRQ_TABLE
|
||||||
|
uses HAVE_HARD_RESET
|
||||||
|
uses i586
|
||||||
|
uses i686
|
||||||
|
uses INTEL_PPRO_MTRR
|
||||||
|
uses HEAP_SIZE
|
||||||
|
uses IRQ_SLOT_COUNT
|
||||||
|
uses MAINBOARD_PART_NUMBER
|
||||||
|
uses MAINBOARD_VENDOR
|
||||||
|
uses CONFIG_SMP
|
||||||
|
uses CONFIG_MAX_CPUS
|
||||||
|
uses MEMORY_HOLE
|
||||||
|
uses PAYLOAD_SIZE
|
||||||
|
uses _RAMBASE
|
||||||
|
uses _ROMBASE
|
||||||
|
uses ROM_IMAGE_SIZE
|
||||||
|
uses ROM_SECTION_OFFSET
|
||||||
|
uses ROM_SECTION_SIZE
|
||||||
|
uses ROM_SIZE
|
||||||
|
uses STACK_SIZE
|
||||||
|
uses USE_FALLBACK_IMAGE
|
||||||
|
uses USE_OPTION_TABLE
|
||||||
|
uses HAVE_OPTION_TABLE
|
||||||
|
uses MAXIMUM_CONSOLE_LOGLEVEL
|
||||||
|
uses DEFAULT_CONSOLE_LOGLEVEL
|
||||||
|
uses CONFIG_CONSOLE_SERIAL8250
|
||||||
|
uses MAINBOARD
|
||||||
|
uses CONFIG_CHIP_CONFIGURE
|
||||||
|
uses XIP_ROM_SIZE
|
||||||
|
uses XIP_ROM_BASE
|
||||||
|
uses LINUXBIOS_EXTRA_VERSION
|
||||||
|
uses TTYS0_BAUD
|
||||||
|
|
||||||
|
option TTYS0_BAUD=19200
|
||||||
|
|
||||||
|
option CONFIG_CHIP_CONFIGURE=1
|
||||||
|
|
||||||
|
option MAXIMUM_CONSOLE_LOGLEVEL=7
|
||||||
|
option DEFAULT_CONSOLE_LOGLEVEL=7
|
||||||
|
option CONFIG_CONSOLE_SERIAL8250=1
|
||||||
|
|
||||||
|
option CPU_FIXUP=1
|
||||||
|
option CONFIG_UDELAY_TSC=0
|
||||||
|
option i686=1
|
||||||
|
option i586=1
|
||||||
|
option INTEL_PPRO_MTRR=1
|
||||||
|
option ROM_SIZE=256*1024
|
||||||
|
|
||||||
|
option HAVE_OPTION_TABLE=1
|
||||||
|
option CONFIG_ROM_STREAM=1
|
||||||
|
option HAVE_FALLBACK_BOOT=1
|
||||||
|
|
||||||
|
###
|
||||||
|
### Compute the location and size of where this firmware image
|
||||||
|
### (linuxBIOS plus bootloader) will live in the boot rom chip.
|
||||||
|
###
|
||||||
|
option FALLBACK_SIZE=131072
|
||||||
|
|
||||||
|
## LinuxBIOS C code runs at this location in RAM
|
||||||
|
option _RAMBASE=0x00004000
|
||||||
|
|
||||||
|
#
|
||||||
|
###
|
||||||
|
### Compute the start location and size size of
|
||||||
|
### The linuxBIOS bootloader.
|
||||||
|
###
|
||||||
|
|
||||||
|
#
|
||||||
|
# Arima hdama
|
||||||
|
romimage "normal"
|
||||||
|
option USE_FALLBACK_IMAGE=0
|
||||||
|
option ROM_IMAGE_SIZE=0x10000
|
||||||
|
option LINUXBIOS_EXTRA_VERSION=".0Normal"
|
||||||
|
mainboard via/epia-m
|
||||||
|
# payload /usr/share/etherboot/5.1.9pre2-lnxi-lb/tg3--ide_disk.zelf
|
||||||
|
# payload ../../../../tg3--ide_disk.zelf
|
||||||
|
payload ../../../../../lnxieepro100.ebi
|
||||||
|
end
|
||||||
|
|
||||||
|
romimage "fallback"
|
||||||
|
option USE_FALLBACK_IMAGE=1
|
||||||
|
option ROM_IMAGE_SIZE=0x10000
|
||||||
|
option LINUXBIOS_EXTRA_VERSION=".0Fallback"
|
||||||
|
mainboard via/epia-m
|
||||||
|
# payload /usr/share/etherboot/5.1.9pre2-lnxi-lb/tg3--ide_disk.zelf
|
||||||
|
# payload ../../../../tg3--ide_disk.zelf
|
||||||
|
payload ../../../../../lnxieepro100.ebi
|
||||||
|
end
|
||||||
|
|
||||||
|
buildrom ./linuxbios.rom ROM_SIZE "normal" "fallback"
|
@ -46,32 +46,33 @@ uses CONFIG_CHIP_CONFIGURE
|
|||||||
uses XIP_ROM_SIZE
|
uses XIP_ROM_SIZE
|
||||||
uses XIP_ROM_BASE
|
uses XIP_ROM_BASE
|
||||||
uses LINUXBIOS_EXTRA_VERSION
|
uses LINUXBIOS_EXTRA_VERSION
|
||||||
uses TTYS0_BAUD
|
uses HAVE_ACPI_TABLES
|
||||||
|
uses CONFIG_LEGACY_VGABIOS
|
||||||
option TTYS0_BAUD=19200
|
uses VGABIOS_START
|
||||||
|
uses VGABIOS_START
|
||||||
option CONFIG_CHIP_CONFIGURE=1
|
option CONFIG_CHIP_CONFIGURE=1
|
||||||
|
|
||||||
option MAXIMUM_CONSOLE_LOGLEVEL=7
|
option MAXIMUM_CONSOLE_LOGLEVEL=8
|
||||||
option DEFAULT_CONSOLE_LOGLEVEL=7
|
option DEFAULT_CONSOLE_LOGLEVEL=8
|
||||||
option CONFIG_CONSOLE_SERIAL8250=1
|
option CONFIG_CONSOLE_SERIAL8250=1
|
||||||
|
option HAVE_ACPI_TABLES=1
|
||||||
option CPU_FIXUP=1
|
option CPU_FIXUP=1
|
||||||
option CONFIG_UDELAY_TSC=0
|
option CONFIG_UDELAY_TSC=0
|
||||||
option i686=1
|
option i686=1
|
||||||
option i586=1
|
option i586=1
|
||||||
option INTEL_PPRO_MTRR=1
|
option INTEL_PPRO_MTRR=1
|
||||||
option ROM_SIZE=256*1024
|
option ROM_SIZE=256*1024
|
||||||
|
option CONFIG_LEGACY_VGABIOS=1
|
||||||
option HAVE_OPTION_TABLE=1
|
option HAVE_OPTION_TABLE=1
|
||||||
option CONFIG_ROM_STREAM=1
|
option CONFIG_ROM_STREAM=1
|
||||||
option HAVE_FALLBACK_BOOT=1
|
option HAVE_FALLBACK_BOOT=1
|
||||||
|
|
||||||
|
option VGABIOS_START=0xfffc0000
|
||||||
###
|
###
|
||||||
### Compute the location and size of where this firmware image
|
### Compute the location and size of where this firmware image
|
||||||
### (linuxBIOS plus bootloader) will live in the boot rom chip.
|
### (linuxBIOS plus bootloader) will live in the boot rom chip.
|
||||||
###
|
###
|
||||||
option FALLBACK_SIZE=131072
|
option FALLBACK_SIZE=0x18000
|
||||||
|
|
||||||
## LinuxBIOS C code runs at this location in RAM
|
## LinuxBIOS C code runs at this location in RAM
|
||||||
option _RAMBASE=0x00004000
|
option _RAMBASE=0x00004000
|
||||||
@ -86,22 +87,26 @@ option _RAMBASE=0x00004000
|
|||||||
# Arima hdama
|
# Arima hdama
|
||||||
romimage "normal"
|
romimage "normal"
|
||||||
option USE_FALLBACK_IMAGE=0
|
option USE_FALLBACK_IMAGE=0
|
||||||
option ROM_IMAGE_SIZE=0x10000
|
option ROM_IMAGE_SIZE=0xc000
|
||||||
|
option ROM_SECTION_OFFSET=0x10000
|
||||||
|
option ROM_SECTION_SIZE=0x18000
|
||||||
option LINUXBIOS_EXTRA_VERSION=".0Normal"
|
option LINUXBIOS_EXTRA_VERSION=".0Normal"
|
||||||
mainboard via/epia-m
|
mainboard via/epia-m
|
||||||
# payload /usr/share/etherboot/5.1.9pre2-lnxi-lb/tg3--ide_disk.zelf
|
# payload /usr/share/etherboot/5.1.9pre2-lnxi-lb/tg3--ide_disk.zelf
|
||||||
# payload ../../../../tg3--ide_disk.zelf
|
# payload ../../../../tg3--ide_disk.zelf
|
||||||
payload ../../../../../lnxieepro100.ebi
|
# payload ../../../../../lnxieepro100.ebi
|
||||||
|
payload /filo.elf
|
||||||
end
|
end
|
||||||
|
|
||||||
romimage "fallback"
|
romimage "fallback"
|
||||||
option USE_FALLBACK_IMAGE=1
|
option USE_FALLBACK_IMAGE=1
|
||||||
option ROM_IMAGE_SIZE=0x10000
|
option ROM_IMAGE_SIZE=0xc000
|
||||||
option LINUXBIOS_EXTRA_VERSION=".0Fallback"
|
option LINUXBIOS_EXTRA_VERSION=".0Fallback"
|
||||||
mainboard via/epia-m
|
mainboard via/epia-m
|
||||||
# payload /usr/share/etherboot/5.1.9pre2-lnxi-lb/tg3--ide_disk.zelf
|
# payload /usr/share/etherboot/5.1.9pre2-lnxi-lb/tg3--ide_disk.zelf
|
||||||
# payload ../../../../tg3--ide_disk.zelf
|
# payload ../../../../tg3--ide_disk.zelf
|
||||||
payload ../../../../../lnxieepro100.ebi
|
# payload ../../../../../lnxieepro100.ebi
|
||||||
|
payload /filo.elf
|
||||||
end
|
end
|
||||||
|
|
||||||
buildrom ./linuxbios.rom ROM_SIZE "normal" "fallback"
|
buildrom ./linuxbios.rom ROM_SIZE "normal" "fallback"
|
||||||
|
112
targets/via/epia-m/Config.vga.filo
Normal file
112
targets/via/epia-m/Config.vga.filo
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
# Sample config file for EPIA-M
|
||||||
|
# This will make a target directory of ./epia-m
|
||||||
|
|
||||||
|
loadoptions
|
||||||
|
|
||||||
|
target epia-m
|
||||||
|
|
||||||
|
uses ARCH
|
||||||
|
uses CONFIG_COMPRESS
|
||||||
|
uses CONFIG_IOAPIC
|
||||||
|
uses CONFIG_ROM_STREAM
|
||||||
|
uses CONFIG_ROM_STREAM_START
|
||||||
|
uses CONFIG_UDELAY_TSC
|
||||||
|
uses CPU_FIXUP
|
||||||
|
uses FALLBACK_SIZE
|
||||||
|
uses HAVE_FALLBACK_BOOT
|
||||||
|
uses HAVE_MP_TABLE
|
||||||
|
uses HAVE_PIRQ_TABLE
|
||||||
|
uses HAVE_HARD_RESET
|
||||||
|
uses i586
|
||||||
|
uses i686
|
||||||
|
uses INTEL_PPRO_MTRR
|
||||||
|
uses HEAP_SIZE
|
||||||
|
uses IRQ_SLOT_COUNT
|
||||||
|
uses MAINBOARD_PART_NUMBER
|
||||||
|
uses MAINBOARD_VENDOR
|
||||||
|
uses CONFIG_SMP
|
||||||
|
uses CONFIG_MAX_CPUS
|
||||||
|
uses MEMORY_HOLE
|
||||||
|
uses PAYLOAD_SIZE
|
||||||
|
uses _RAMBASE
|
||||||
|
uses _ROMBASE
|
||||||
|
uses ROM_IMAGE_SIZE
|
||||||
|
uses ROM_SECTION_OFFSET
|
||||||
|
uses ROM_SECTION_SIZE
|
||||||
|
uses ROM_SIZE
|
||||||
|
uses STACK_SIZE
|
||||||
|
uses USE_FALLBACK_IMAGE
|
||||||
|
uses USE_OPTION_TABLE
|
||||||
|
uses HAVE_OPTION_TABLE
|
||||||
|
uses MAXIMUM_CONSOLE_LOGLEVEL
|
||||||
|
uses DEFAULT_CONSOLE_LOGLEVEL
|
||||||
|
uses CONFIG_CONSOLE_SERIAL8250
|
||||||
|
uses MAINBOARD
|
||||||
|
uses CONFIG_CHIP_CONFIGURE
|
||||||
|
uses XIP_ROM_SIZE
|
||||||
|
uses XIP_ROM_BASE
|
||||||
|
uses LINUXBIOS_EXTRA_VERSION
|
||||||
|
uses HAVE_ACPI_TABLES
|
||||||
|
uses CONFIG_LEGACY_VGABIOS
|
||||||
|
uses VGABIOS_START
|
||||||
|
uses VGABIOS_START
|
||||||
|
option CONFIG_CHIP_CONFIGURE=1
|
||||||
|
|
||||||
|
option MAXIMUM_CONSOLE_LOGLEVEL=8
|
||||||
|
option DEFAULT_CONSOLE_LOGLEVEL=8
|
||||||
|
option CONFIG_CONSOLE_SERIAL8250=1
|
||||||
|
option HAVE_ACPI_TABLES=1
|
||||||
|
option CPU_FIXUP=1
|
||||||
|
option CONFIG_UDELAY_TSC=0
|
||||||
|
option i686=1
|
||||||
|
option i586=1
|
||||||
|
option INTEL_PPRO_MTRR=1
|
||||||
|
option ROM_SIZE=256*1024
|
||||||
|
option CONFIG_LEGACY_VGABIOS=1
|
||||||
|
option HAVE_OPTION_TABLE=1
|
||||||
|
option CONFIG_ROM_STREAM=1
|
||||||
|
option HAVE_FALLBACK_BOOT=1
|
||||||
|
|
||||||
|
option VGABIOS_START=0xfffc0000
|
||||||
|
###
|
||||||
|
### Compute the location and size of where this firmware image
|
||||||
|
### (linuxBIOS plus bootloader) will live in the boot rom chip.
|
||||||
|
###
|
||||||
|
option FALLBACK_SIZE=0x18000
|
||||||
|
|
||||||
|
## LinuxBIOS C code runs at this location in RAM
|
||||||
|
option _RAMBASE=0x00004000
|
||||||
|
|
||||||
|
#
|
||||||
|
###
|
||||||
|
### Compute the start location and size size of
|
||||||
|
### The linuxBIOS bootloader.
|
||||||
|
###
|
||||||
|
|
||||||
|
#
|
||||||
|
# Arima hdama
|
||||||
|
romimage "normal"
|
||||||
|
option USE_FALLBACK_IMAGE=0
|
||||||
|
option ROM_IMAGE_SIZE=0xc000
|
||||||
|
option ROM_SECTION_OFFSET=0x10000
|
||||||
|
option ROM_SECTION_SIZE=0x18000
|
||||||
|
option LINUXBIOS_EXTRA_VERSION=".0Normal"
|
||||||
|
mainboard via/epia-m
|
||||||
|
# payload /usr/share/etherboot/5.1.9pre2-lnxi-lb/tg3--ide_disk.zelf
|
||||||
|
# payload ../../../../tg3--ide_disk.zelf
|
||||||
|
# payload ../../../../../lnxieepro100.ebi
|
||||||
|
payload /filo.elf
|
||||||
|
end
|
||||||
|
|
||||||
|
romimage "fallback"
|
||||||
|
option USE_FALLBACK_IMAGE=1
|
||||||
|
option ROM_IMAGE_SIZE=0xc000
|
||||||
|
option LINUXBIOS_EXTRA_VERSION=".0Fallback"
|
||||||
|
mainboard via/epia-m
|
||||||
|
# payload /usr/share/etherboot/5.1.9pre2-lnxi-lb/tg3--ide_disk.zelf
|
||||||
|
# payload ../../../../tg3--ide_disk.zelf
|
||||||
|
# payload ../../../../../lnxieepro100.ebi
|
||||||
|
payload /filo.elf
|
||||||
|
end
|
||||||
|
|
||||||
|
buildrom ./linuxbios.rom ROM_SIZE "normal" "fallback"
|
42
util/resetcf/resetcf.c
Normal file
42
util/resetcf/resetcf.c
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
volatile unsigned char *cp;
|
||||||
|
int fd;
|
||||||
|
void *v;
|
||||||
|
off_t nvram;
|
||||||
|
size_t length = 0x1000;
|
||||||
|
|
||||||
|
fd = open("/proc/bus/pci/00/0a.1",O_RDONLY);
|
||||||
|
lseek(fd,0x10,0);
|
||||||
|
read(fd,&nvram,sizeof(nvram));
|
||||||
|
close(fd);
|
||||||
|
//printf("Star %x\n",nvram);
|
||||||
|
|
||||||
|
if((fd = open("/dev/mem",O_RDWR)) != -1)
|
||||||
|
{
|
||||||
|
v = mmap(0, length, PROT_READ | PROT_WRITE, MAP_SHARED,fd,nvram);
|
||||||
|
fprintf(stderr, "mmap returns %p\n", v);
|
||||||
|
|
||||||
|
if ( v == (void *) -1)
|
||||||
|
{
|
||||||
|
perror("mmap");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
perror("open /dev/mem");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for( i = 0x836 ; i < 0x840 ; i++){
|
||||||
|
*(unsigned char *)(v+i) = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user