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:
David W. Hendricks 2004-02-09 22:47:38 +00:00
parent c34d5ca790
commit 854e45292b
4 changed files with 101 additions and 19 deletions

View File

@ -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) {

View File

@ -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");

View File

@ -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");
} }

View File

@ -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,
}; };