1 #include <console/console.h>
2 #include <device/device.h>
3 #include <device/pci.h>
4 #include <device/pci_ops.h>
5 #include <device/pci_ids.h>
9 static void ide_init(struct device *dev)
11 struct southbridge_via_vt8231_config *conf;
12 unsigned char enables;
14 if (!conf->enable_native_ide) {
15 // Run the IDE controller in 'compatiblity mode - i.e. don't use PCI
16 // interrupts. Using PCI ints confuses linux for some reason.
18 printk_info("%s: enabling compatibility IDE addresses\n", __FUNCTION__);
19 enables = pci_read_config8(dev, 0x42);
20 printk_debug("enables in reg 0x42 0x%x\n", enables);
21 enables &= ~0xc0; // compatability mode
22 pci_write_config8(dev, 0x42, enables);
23 enables = pci_read_config8(dev, 0x42);
24 printk_debug("enables in reg 0x42 read back as 0x%x\n", enables);
27 enables = pci_read_config8(dev, 0x40);
28 printk_debug("enables in reg 0x40 0x%x\n", enables);
30 pci_write_config8(dev, 0x40, enables);
31 enables = pci_read_config8(dev, 0x40);
32 printk_debug("enables in reg 0x40 read back as 0x%x\n", enables);
34 // Enable prefetch buffers
35 enables = pci_read_config8(dev, 0x41);
37 pci_write_config8(dev, 0x41, enables);
39 // Lower thresholds (cause award does it)
40 enables = pci_read_config8(dev, 0x43);
43 pci_write_config8(dev, 0x43, enables);
45 // PIO read prefetch counter (cause award does it)
46 pci_write_config8(dev, 0x44, 0x18);
48 // Use memory read multiple
49 pci_write_config8(dev, 0x45, 0x1c);
52 // we want "flexible", i.e. 1f0-1f7 etc. or native PCI
53 // kevinh@ispiri.com - the standard linux drivers seem ass slow when
54 // used in native mode - I've changed back to classic
55 enables = pci_read_config8(dev, 0x9);
56 printk_debug("enables in reg 0x9 0x%x\n", enables);
57 // by the book, set the low-order nibble to 0xa.
58 if (conf->enable_native_ide) {
60 // cf/cg silicon needs an 'f' here.
66 pci_write_config8(dev, 0x9, enables);
67 enables = pci_read_config8(dev, 0x9);
68 printk_debug("enables in reg 0x9 read back as 0x%x\n", enables);
70 // standard bios sets master bit.
71 enables = pci_read_config8(dev, 0x4);
72 printk_debug("command in reg 0x4 0x%x\n", enables);
75 // No need for stepping - kevinh@ispiri.com
78 pci_write_config8(dev, 0x4, enables);
79 enables = pci_read_config8(dev, 0x4);
80 printk_debug("command in reg 0x4 reads back as 0x%x\n", enables);
82 if (!conf->enable_native_ide) {
83 // Use compatability mode - per award bios
84 pci_write_config32(dev, 0x10, 0x0);
85 pci_write_config32(dev, 0x14, 0x0);
86 pci_write_config32(dev, 0x18, 0x0);
87 pci_write_config32(dev, 0x1c, 0x0);
89 // Force interrupts to use compat mode - just like Award bios
90 pci_write_config8(dev, 0x3d, 00);
91 pci_write_config8(dev, 0x3c, 0xff);
95 static struct device_operations ide_ops = {
96 .read_resources = pci_dev_read_resources,
97 .set_resources = pci_dev_set_resources,
98 .enable_resources = pci_dev_enable_resources,
104 static struct pci_driver northbridge_driver __pci_driver = {
106 .vendor = PCI_VENDOR_ID_VIA,
107 .device = PCI_DEVICE_ID_VIA_82C586_1,