more changes; rumba enet works fine now.
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2290 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
dc7b71cffa
commit
c01fe5d1b6
|
@ -1,5 +1,5 @@
|
||||||
extern struct chip_operations mainboard_amd_rumba_ops;
|
extern struct chip_operations mainboard_amd_rumba_ops;
|
||||||
|
|
||||||
struct mainboard_amd_rumba_config {
|
struct mainboard_amd_rumba_config {
|
||||||
int nothing;
|
int nicirq;
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,7 +6,38 @@
|
||||||
#include <arch/io.h>
|
#include <arch/io.h>
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
|
|
||||||
|
static void init(struct device *dev) {
|
||||||
|
struct mainboard_amd_rumba_config *mainboard = (struct mainboard_amd_rumba_config*)dev->chip_info;
|
||||||
|
device_t nic = NULL;
|
||||||
|
unsigned bus = 0;
|
||||||
|
unsigned devfn = PCI_DEVFN(0xd, 0);
|
||||||
|
int nicirq = 1;
|
||||||
|
|
||||||
|
if (mainboard->nicirq)
|
||||||
|
nicirq = mainboard->nicirq;
|
||||||
|
|
||||||
|
printk_debug("AMD RUMBA ENTER %s\n", __FUNCTION__);
|
||||||
|
|
||||||
|
if (nicirq) {
|
||||||
|
printk_debug("%s (%x,%x)SET PCI interrupt line to %d\n",
|
||||||
|
__FUNCTION__, bus, devfn, nicirq);
|
||||||
|
nic = dev_find_slot(bus, devfn);
|
||||||
|
if (! nic){
|
||||||
|
printk_err("Could not find NIC\n");
|
||||||
|
} else {
|
||||||
|
pci_write_config8(nic, PCI_INTERRUPT_LINE, nicirq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printk_debug("AMD RUMBA EXIT %s\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void enable_dev(struct device *dev)
|
||||||
|
{
|
||||||
|
dev->ops->init = init;
|
||||||
|
}
|
||||||
|
|
||||||
struct chip_operations mainboard_amd_rumba_ops = {
|
struct chip_operations mainboard_amd_rumba_ops = {
|
||||||
CHIP_NAME("AMD Rumba mainboard ")
|
CHIP_NAME("AMD Rumba mainboard ")
|
||||||
|
.enable_dev = enable_dev,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -133,6 +133,7 @@ chip northbridge/amd/gx2
|
||||||
device pci 1.0 on end
|
device pci 1.0 on end
|
||||||
device pci 1.1 on end
|
device pci 1.1 on end
|
||||||
chip southbridge/amd/cs5536
|
chip southbridge/amd/cs5536
|
||||||
|
register "enable_gpio0_inta" = "1"
|
||||||
device pci d.0 on end # Realtek 8139 LAN
|
device pci d.0 on end # Realtek 8139 LAN
|
||||||
device pci f.0 on end # ISA Bridge
|
device pci f.0 on end # ISA Bridge
|
||||||
device pci f.2 on end # IDE Controller
|
device pci f.2 on end # IDE Controller
|
||||||
|
|
|
@ -338,17 +338,27 @@ static void GLPCIInit(void){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (gl) {
|
if (gl) {
|
||||||
|
unsigned long pah, pal;
|
||||||
msrnum = gl->desc_name;
|
msrnum = gl->desc_name;
|
||||||
msr = rdmsr(msrnum);
|
msr = rdmsr(msrnum);
|
||||||
|
/* example R_SYSMEM value: 20:00:00:0f:fb:f0:01:00
|
||||||
|
* translates to a base of 0x00100000 and top of 0xffbf0000
|
||||||
|
* base of 1M and top of around 256M
|
||||||
|
*/
|
||||||
|
/* we have to create a page-aligned (4KB page) address for base and top */
|
||||||
|
/* So we need a high page aligned addresss (pah) and low page aligned address (pal)
|
||||||
|
* pah is from msr.hi << 12 | msr.low >> 20. pal is msr.lo << 12
|
||||||
|
*/
|
||||||
|
printk_debug("GLPCI r1: system msr.lo 0x%x msr.hi 0x%x\n", msr.lo, msr.hi);
|
||||||
|
pah = ((msr.hi &0xff) << 12) | ((msr.lo >> 20) & 0xfff);
|
||||||
|
/* we have the page address. Now make it a page-aligned address */
|
||||||
|
pah <<= 12;
|
||||||
|
|
||||||
/* 20 bit address The bottom 12 bits go into bits 20-31 in eax. The top 8 bits go into 0-7 of edx.*/
|
pal = msr.lo << 12;
|
||||||
val = msr.hi & 0xff; /* EAX[31:20] = low 12 bits and EAX[7:0] upper 8 bits*/
|
msr.hi = pah;
|
||||||
val <<= 12; /* EAX[31:20] = junk EAX[19:0] = 20 bit address*/
|
msr.lo = pal;
|
||||||
val &= 0xfffff;
|
msr.lo |= GLPCI_RC_LOWER_EN_SET | GLPCI_RC_LOWER_PF_SET | GLPCI_RC_LOWER_WC_SET;
|
||||||
val <<= GLPCI_RC_UPPER_TOP_SHIFT;
|
printk_debug("GLPCI r1: system msr.lo 0x%x msr.hi 0x%x\n", msr.lo, msr.hi);
|
||||||
msr.hi = val /* Top Set*/;
|
|
||||||
msr.lo = (0x100000 >> 12) << GLPCI_RC_LOWER_BASE_SHIFT /* 1MB >> =20bit address then shift into register*/;
|
|
||||||
msr.lo |= GLPCI_RC_LOWER_EN_SET + GLPCI_RC_LOWER_PF_SET + GLPCI_RC_LOWER_WC_SET;
|
|
||||||
msrnum = GLPCI_RC1;
|
msrnum = GLPCI_RC1;
|
||||||
wrmsr(msrnum, msr);
|
wrmsr(msrnum, msr);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue