X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fsouthbridge%2Fsis%2Fsis966%2Fsis966_lpc.c;h=26f60dd3af11bb6fe271ded7d1a072920a063778;hb=b69cb5a31058c0295f2d810c852cc5b52d77225c;hp=dd369b694bbb540cf59cbb7c1645e437bc66727b;hpb=e42e142d9fc0048574664c3c92bdc1bbca35c9be;p=coreboot.git diff --git a/src/southbridge/sis/sis966/sis966_lpc.c b/src/southbridge/sis/sis966/sis966_lpc.c index dd369b694..26f60dd3a 100644 --- a/src/southbridge/sis/sis966/sis966_lpc.c +++ b/src/southbridge/sis/sis966/sis966_lpc.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include "sis966.h" @@ -42,84 +43,6 @@ #define NMI_OFF 0 -struct ioapicreg { - unsigned int reg; - unsigned int value_low, value_high; -}; - -static struct ioapicreg ioapicregvalues[] = { -#define ALL (0xff << 24) -#define NONE (0) -#define DISABLED (1 << 16) -#define ENABLED (0 << 16) -#define TRIGGER_EDGE (0 << 15) -#define TRIGGER_LEVEL (1 << 15) -#define POLARITY_HIGH (0 << 13) -#define POLARITY_LOW (1 << 13) -#define PHYSICAL_DEST (0 << 11) -#define LOGICAL_DEST (1 << 11) -#define ExtINT (7 << 8) -#define NMI (4 << 8) -#define SMI (2 << 8) -#define INT (1 << 8) - /* IO-APIC virtual wire mode configuration */ - /* mask, trigger, polarity, destination, delivery, vector */ - { 0, ENABLED | TRIGGER_EDGE | POLARITY_HIGH | PHYSICAL_DEST | ExtINT, NONE}, - { 1, DISABLED, NONE}, - { 2, DISABLED, NONE}, - { 3, DISABLED, NONE}, - { 4, DISABLED, NONE}, - { 5, DISABLED, NONE}, - { 6, DISABLED, NONE}, - { 7, DISABLED, NONE}, - { 8, DISABLED, NONE}, - { 9, DISABLED, NONE}, - { 10, DISABLED, NONE}, - { 11, DISABLED, NONE}, - { 12, DISABLED, NONE}, - { 13, DISABLED, NONE}, - { 14, DISABLED, NONE}, - { 15, DISABLED, NONE}, - { 16, DISABLED, NONE}, - { 17, DISABLED, NONE}, - { 18, DISABLED, NONE}, - { 19, DISABLED, NONE}, - { 20, DISABLED, NONE}, - { 21, DISABLED, NONE}, - { 22, DISABLED, NONE}, - { 23, DISABLED, NONE}, - /* Be careful and don't write past the end... */ -}; - -static void setup_ioapic(unsigned long ioapic_base) -{ - int i; - unsigned long value_low, value_high; -// unsigned long ioapic_base = 0xfec00000; - volatile unsigned long *l; - struct ioapicreg *a = ioapicregvalues; - - ioapicregvalues[0].value_high = lapicid()<<(56-32); - - l = (unsigned long *) ioapic_base; - - for (i = 0; i < ARRAY_SIZE(ioapicregvalues); - i++, a++) { - l[0] = (a->reg * 2) + 0x10; - l[4] = a->value_low; - value_low = l[4]; - l[0] = (a->reg *2) + 0x11; - l[4] = a->value_high; - value_high = l[4]; - if ((i==0) && (value_low == 0xffffffff)) { - printk_warning("IO APIC not responding.\n"); - return; - } - printk_spew("for IRQ, reg 0x%08x value 0x%08x 0x%08x\n", - a->reg, a->value_low, a->value_high); - } -} - // 0x7a or e3 #define PREVIOUS_POWER_STATE 0x7A @@ -132,26 +55,28 @@ static void setup_ioapic(unsigned long ioapic_base) #define CONFIG_MAINBOARD_POWER_ON_AFTER_POWER_FAIL MAINBOARD_POWER_ON #endif +#undef SLAVE_INIT + static void lpc_common_init(device_t dev) { uint8_t byte; - uint32_t dword; + uint32_t ioapic_base; /* IO APIC initialization */ byte = pci_read_config8(dev, 0x74); byte |= (1<<0); // enable APIC pci_write_config8(dev, 0x74, byte); - dword = pci_read_config32(dev, PCI_BASE_ADDRESS_1); // 0x14 - - setup_ioapic(dword); + ioapic_base = pci_read_config32(dev, PCI_BASE_ADDRESS_1); // 0x14 + setup_ioapic(ioapic_base, 0); // Don't rename IO APIC ID } +#ifdef SLAVE_INIT static void lpc_slave_init(device_t dev) { lpc_common_init(dev); } - +#endif static void lpc_usb_legacy_init(device_t dev) { @@ -170,8 +95,8 @@ static void lpc_init(device_t dev) int on; int nmi_option; - printk_debug("LPC_INIT -------->\n"); - init_pc_keyboard(0x60, 0x64, 0); + printk(BIOS_DEBUG, "LPC_INIT -------->\n"); + pc_keyboard_init(0); lpc_usb_legacy_init(dev); lpc_common_init(dev); @@ -187,7 +112,7 @@ static void lpc_init(device_t dev) byte |= 0x40; } pci_write_config8(dev, PREVIOUS_POWER_STATE, byte); - printk_info("set power %s after power fail\n", on?"on":"off"); + printk(BIOS_INFO, "set power %s after power fail\n", on?"on":"off"); /* Throttle the CPU speed down for testing */ on = SLOW_CPU_OFF; @@ -199,7 +124,7 @@ static void lpc_init(device_t dev) outl(((on<<1)+0x10) ,(pm10_bar + 0x10)); dword = inl(pm10_bar + 0x10); on = 8-on; - printk_debug("Throttling CPU %2d.%1.1d percent.\n", + printk(BIOS_DEBUG, "Throttling CPU %2d.%1.1d percent.\n", (on*12)+(on>>1),(on&1)*5); } @@ -229,7 +154,7 @@ static void lpc_init(device_t dev) /* Initialize isa dma */ isa_dma_init(); - printk_debug("LPC_INIT <--------\n"); + printk(BIOS_DEBUG, "LPC_INIT <--------\n"); } static void sis966_lpc_read_resources(device_t dev) @@ -253,46 +178,36 @@ static void sis966_lpc_read_resources(device_t dev) IORESOURCE_ASSIGNED | IORESOURCE_FIXED; res = new_resource(dev, 3); /* IOAPIC */ - res->base = 0xfec00000; + res->base = IO_APIC_ADDR; res->size = 0x00001000; res->flags = IORESOURCE_MEM | IORESOURCE_ASSIGNED | IORESOURCE_FIXED; } /** - * @brief Enable resources for children devices + * Enable resources for children devices. * - * @param dev the device whos children's resources are to be enabled - * - * This function is call by the global enable_resources() indirectly via the - * device_operation::enable_resources() method of devices. - * - * Indirect mutual recursion: - * enable_childrens_resources() -> enable_resources() - * enable_resources() -> device_operation::enable_resources() - * device_operation::enable_resources() -> enable_children_resources() + * @param dev The device whos children's resources are to be enabled. */ static void sis966_lpc_enable_childrens_resources(device_t dev) { - unsigned link; + struct bus *link; uint32_t reg, reg_var[4]; int i; int var_num = 0; reg = pci_read_config32(dev, 0xa0); - for (link = 0; link < dev->links; link++) { + for (link = dev->link_list; link; link = link->next) { device_t child; - for (child = dev->link[link].children; child; child = child->sibling) { - enable_resources(child); + for (child = link->children; child; child = child->sibling) { if(child->enabled && (child->path.type == DEVICE_PATH_PNP)) { - for(i=0;iresources;i++) { - struct resource *res; + struct resource *res; + for(res = child->resource_list; res; res = res->next) { unsigned long base, end; // don't need long long - res = &child->resource[i]; if(!(res->flags & IORESOURCE_IO)) continue; base = res->base; end = resource_end(res); - printk_debug("sis966 lpc decode:%s, base=0x%08x, end=0x%08x\n",dev_path(child),base, end); + printk(BIOS_DEBUG, "sis966 lpc decode:%s, base=0x%08lx, end=0x%08lx\n",dev_path(child),base, end); switch(base) { case 0x3f8: // COM1 reg |= (1<<0); break; @@ -349,12 +264,14 @@ static struct device_operations lpc_ops = { // .enable = sis966_enable, .ops_pci = &lops_pci, }; + static const struct pci_driver lpc_driver __pci_driver = { .ops = &lpc_ops, .vendor = PCI_VENDOR_ID_SIS, .device = PCI_DEVICE_ID_SIS_SIS966_LPC, }; +#ifdef SLAVE_INIT // No device? static struct device_operations lpc_slave_ops = { .read_resources = sis966_lpc_read_resources, .set_resources = pci_dev_set_resources, @@ -363,3 +280,4 @@ static struct device_operations lpc_slave_ops = { // .enable = sis966_enable, .ops_pci = &lops_pci, }; +#endif