final merge of YhLu's stuff
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1371 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
c34d5ca790
commit
854e45292b
|
@ -320,8 +320,8 @@ unsigned int hypertransport_scan_chain(struct bus *bus, unsigned int max)
|
||||||
#if HAVE_HARD_RESET == 1
|
#if HAVE_HARD_RESET == 1
|
||||||
if(reset_needed) {
|
if(reset_needed) {
|
||||||
printk_info("HyperT reset needed\n");
|
printk_info("HyperT reset needed\n");
|
||||||
hard_reset();
|
// By LYH hard_reset();
|
||||||
}
|
} else
|
||||||
printk_debug("HyperT reset not needed\n");
|
printk_debug("HyperT reset not needed\n");
|
||||||
#endif
|
#endif
|
||||||
if (next_unitid > 0x1f) {
|
if (next_unitid > 0x1f) {
|
||||||
|
|
|
@ -100,6 +100,42 @@ static void disable_probes(void)
|
||||||
print_debug("done.\r\n");
|
print_debug("done.\r\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
//BY LYH
|
||||||
|
#if 0
|
||||||
|
#define WAIT_TIMES 1000
|
||||||
|
static void wait_ap_stop(u8 node)
|
||||||
|
{
|
||||||
|
unsigned long reg;
|
||||||
|
unsigned long i;
|
||||||
|
for(i=0;i<WAIT_TIMES;i++) {
|
||||||
|
unsigned long regx;
|
||||||
|
regx = pci_read_config32(NODE_HT(node),0x6c);
|
||||||
|
if((regx & (1<<4))==1) break;
|
||||||
|
}
|
||||||
|
reg = pci_read_config32(NODE_HT(node),0x6c);
|
||||||
|
reg &= ~(1<<4); // clear it
|
||||||
|
pci_write_config32(NODE_HT(node), 0x6c, reg);
|
||||||
|
|
||||||
|
}
|
||||||
|
static void notify_bsp_ap_is_stopped(void)
|
||||||
|
{
|
||||||
|
unsigned long reg;
|
||||||
|
unsigned long apic_id;
|
||||||
|
apic_id = *((volatile unsigned long *)(APIC_DEFAULT_BASE+APIC_ID));
|
||||||
|
apic_id >>= 24;
|
||||||
|
/* print_debug("applicaton cpu apic_id: ");
|
||||||
|
print_debug_hex32(apic_id);
|
||||||
|
}*/
|
||||||
|
if(apic_id!=0) { //AP apic_id == node_id ??
|
||||||
|
// set the ColdResetbit to notify BSP that AP is stopped
|
||||||
|
reg = pci_read_config32(NODE_HT(apic_id), 0x6C);
|
||||||
|
reg |= 1<<4;
|
||||||
|
pci_write_config32(NODE_HT(apic_id), 0x6C, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//BY LYH END
|
||||||
|
|
||||||
static void enable_routing(u8 node)
|
static void enable_routing(u8 node)
|
||||||
{
|
{
|
||||||
|
@ -152,6 +188,15 @@ static void rename_temp_node(u8 node)
|
||||||
val |= node; /* new node */
|
val |= node; /* new node */
|
||||||
pci_write_config32(NODE_HT(7), 0x60, val);
|
pci_write_config32(NODE_HT(7), 0x60, val);
|
||||||
|
|
||||||
|
//BY LYH
|
||||||
|
#if 0
|
||||||
|
if(node!=0) {
|
||||||
|
wait_ap_stop(node);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
//BY LYH END
|
||||||
|
|
||||||
|
|
||||||
print_debug(" done.\r\n");
|
print_debug(" done.\r\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <device/pci_ops.h>
|
#include <device/pci_ops.h>
|
||||||
#include "./cpu_rev.c"
|
#include "./cpu_rev.c"
|
||||||
|
|
||||||
|
static cpu_reset_count = 0; //By LYH
|
||||||
static void misc_control_init(struct device *dev)
|
static void misc_control_init(struct device *dev)
|
||||||
{
|
{
|
||||||
uint32_t cmd;
|
uint32_t cmd;
|
||||||
|
@ -52,27 +53,20 @@ static void misc_control_init(struct device *dev)
|
||||||
cmd = 0x04e20707;
|
cmd = 0x04e20707;
|
||||||
pci_write_config32(dev, 0xd4, cmd );
|
pci_write_config32(dev, 0xd4, cmd );
|
||||||
}
|
}
|
||||||
|
#if 1
|
||||||
/*
|
#if HAVE_HARD_RESET==1
|
||||||
* FIXME: This preprocessor check is a mere workaround.
|
cpu_reset_count++; //by LYH
|
||||||
* The right fix is to walk over all links on all nodes
|
|
||||||
* and set the FIFO read pointer optimization value to
|
|
||||||
* 0x25 for each link connected to an AMD HT device.
|
|
||||||
*
|
|
||||||
* The reason this is only enabled for machines with more
|
|
||||||
* than one CPU is that Athlon64 machines don't have the
|
|
||||||
* link at all that is optimized in the code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if CONFIG_MAX_CPUS > 1
|
|
||||||
cmd = pci_read_config32(dev, 0xdc);
|
cmd = pci_read_config32(dev, 0xdc);
|
||||||
if((cmd & 0x0000ff00) != 0x02500) {
|
if((cmd & 0x0000ff00) != 0x02500) {
|
||||||
cmd &= 0xffff00ff;
|
cmd &= 0xffff00ff;
|
||||||
cmd |= 0x00002500;
|
cmd |= 0x00002500;
|
||||||
pci_write_config32(dev, 0xdc, cmd );
|
pci_write_config32(dev, 0xdc, cmd );
|
||||||
printk_debug("resetting cpu\n");
|
if(cpu_reset_count==CONFIG_MAX_CPUS) { //By LYH
|
||||||
hard_reset();
|
printk_debug("resetting cpu\n");
|
||||||
}
|
hard_reset();
|
||||||
|
} //By LYH
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
printk_debug("done.\n");
|
printk_debug("done.\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -415,6 +415,13 @@ static void amdk8_set_resource(device_t dev, struct resource *resource, unsigned
|
||||||
limit |= rlimit & 0x01fff000;
|
limit |= rlimit & 0x01fff000;
|
||||||
limit |= (link & 3) << 4;
|
limit |= (link & 3) << 4;
|
||||||
limit |= (nodeid & 3);
|
limit |= (nodeid & 3);
|
||||||
|
if (reg == 0xc8){
|
||||||
|
/* hack to set vga for test */
|
||||||
|
/* factory: b0: 03 0a 00 00 00 0b 00 00 */
|
||||||
|
f1_write_config32(0xb0, 0xa03);
|
||||||
|
f1_write_config32(0xb4, 0xb00);
|
||||||
|
base |= 0x30;
|
||||||
|
}
|
||||||
f1_write_config32(reg + 0x4, limit);
|
f1_write_config32(reg + 0x4, limit);
|
||||||
f1_write_config32(reg, base);
|
f1_write_config32(reg, base);
|
||||||
}
|
}
|
||||||
|
@ -476,10 +483,45 @@ unsigned int amdk8_scan_root_bus(device_t root, unsigned int max)
|
||||||
return max;
|
return max;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void amdk8_enable_resources(struct device *dev)
|
||||||
|
{
|
||||||
|
uint16_t ctrl;
|
||||||
|
unsigned link;
|
||||||
|
unsigned int vgalink = -1;
|
||||||
|
|
||||||
|
ctrl = pci_read_config16(dev, PCI_BRIDGE_CONTROL);
|
||||||
|
ctrl |= dev->link[0].bridge_ctrl;
|
||||||
|
printk_debug("%s bridge ctrl <- %04x\n", dev_path(dev), ctrl);
|
||||||
|
printk_err("%s bridge ctrl <- %04x\n", dev_path(dev), ctrl);
|
||||||
|
pci_write_config16(dev, PCI_BRIDGE_CONTROL, ctrl);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* let's see what link VGA is on */
|
||||||
|
for(link = 0; link < dev->links; link++) {
|
||||||
|
device_t child;
|
||||||
|
printk_err("Kid %d of k8: bridge ctrl says: 0x%x\n", link, dev->link[link].bridge_ctrl);
|
||||||
|
if (dev->link[link].bridge_ctrl & PCI_BRIDGE_CTL_VGA)
|
||||||
|
vgalink = link;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vgalink != =1) {
|
||||||
|
/* now find the IOPAIR that goes to vgalink and set the vga enable in the base part (0x30) */
|
||||||
|
/* now allocate an MMIOPAIR and point it to the CPU0, LINK=vgalink */
|
||||||
|
/* now set IORR1 so it has a hole for the 0xa0000-0xcffff region */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pci_dev_enable_resources(dev);
|
||||||
|
//enable_childrens_resources(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static struct device_operations northbridge_operations = {
|
static struct device_operations northbridge_operations = {
|
||||||
.read_resources = amdk8_read_resources,
|
.read_resources = amdk8_read_resources,
|
||||||
.set_resources = amdk8_set_resources,
|
.set_resources = amdk8_set_resources,
|
||||||
.enable_resources = pci_dev_enable_resources,
|
// .enable_resources = pci_dev_enable_resources,
|
||||||
|
.enable_resources = amdk8_enable_resources,
|
||||||
.init = 0,
|
.init = 0,
|
||||||
.scan_bus = amdk8_scan_chains,
|
.scan_bus = amdk8_scan_chains,
|
||||||
.enable = 0,
|
.enable = 0,
|
||||||
|
@ -496,3 +538,4 @@ struct chip_control northbridge_amd_amdk8_control = {
|
||||||
.name = "AMD K8 Northbridge",
|
.name = "AMD K8 Northbridge",
|
||||||
.enumerate = enumerate,
|
.enumerate = enumerate,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue