diff options
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r-- | drivers/pci/quirks.c | 39 |
1 files changed, 1 insertions, 38 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 2a7521677541..356846bd7ffb 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -1938,53 +1938,16 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1 | |||
1938 | static void __devinit quirk_p64h2_1k_io(struct pci_dev *dev) | 1938 | static void __devinit quirk_p64h2_1k_io(struct pci_dev *dev) |
1939 | { | 1939 | { |
1940 | u16 en1k; | 1940 | u16 en1k; |
1941 | u8 io_base_lo, io_limit_lo; | ||
1942 | unsigned long base, limit; | ||
1943 | struct resource *res = dev->resource + PCI_BRIDGE_RESOURCES; | ||
1944 | 1941 | ||
1945 | pci_read_config_word(dev, 0x40, &en1k); | 1942 | pci_read_config_word(dev, 0x40, &en1k); |
1946 | 1943 | ||
1947 | if (en1k & 0x200) { | 1944 | if (en1k & 0x200) { |
1948 | dev_info(&dev->dev, "Enable I/O Space to 1KB granularity\n"); | 1945 | dev_info(&dev->dev, "Enable I/O Space to 1KB granularity\n"); |
1949 | 1946 | dev->io_window_1k = 1; | |
1950 | pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo); | ||
1951 | pci_read_config_byte(dev, PCI_IO_LIMIT, &io_limit_lo); | ||
1952 | base = (io_base_lo & (PCI_IO_RANGE_MASK | 0x0c)) << 8; | ||
1953 | limit = (io_limit_lo & (PCI_IO_RANGE_MASK | 0x0c)) << 8; | ||
1954 | |||
1955 | if (base <= limit) { | ||
1956 | res->start = base; | ||
1957 | res->end = limit + 0x3ff; | ||
1958 | } | ||
1959 | } | 1947 | } |
1960 | } | 1948 | } |
1961 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1460, quirk_p64h2_1k_io); | 1949 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1460, quirk_p64h2_1k_io); |
1962 | 1950 | ||
1963 | /* Fix the IOBL_ADR for 1k I/O space granularity on the Intel P64H2 | ||
1964 | * The IOBL_ADR gets re-written to 4k boundaries in pci_setup_bridge() | ||
1965 | * in drivers/pci/setup-bus.c | ||
1966 | */ | ||
1967 | static void __devinit quirk_p64h2_1k_io_fix_iobl(struct pci_dev *dev) | ||
1968 | { | ||
1969 | u16 en1k, iobl_adr, iobl_adr_1k; | ||
1970 | struct resource *res = dev->resource + PCI_BRIDGE_RESOURCES; | ||
1971 | |||
1972 | pci_read_config_word(dev, 0x40, &en1k); | ||
1973 | |||
1974 | if (en1k & 0x200) { | ||
1975 | pci_read_config_word(dev, PCI_IO_BASE, &iobl_adr); | ||
1976 | |||
1977 | iobl_adr_1k = iobl_adr | (res->start >> 8) | (res->end & 0xfc00); | ||
1978 | |||
1979 | if (iobl_adr != iobl_adr_1k) { | ||
1980 | dev_info(&dev->dev, "Fixing P64H2 IOBL_ADR from 0x%x to 0x%x for 1KB granularity\n", | ||
1981 | iobl_adr,iobl_adr_1k); | ||
1982 | pci_write_config_word(dev, PCI_IO_BASE, iobl_adr_1k); | ||
1983 | } | ||
1984 | } | ||
1985 | } | ||
1986 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1460, quirk_p64h2_1k_io_fix_iobl); | ||
1987 | |||
1988 | /* Under some circumstances, AER is not linked with extended capabilities. | 1951 | /* Under some circumstances, AER is not linked with extended capabilities. |
1989 | * Force it to be linked by setting the corresponding control bit in the | 1952 | * Force it to be linked by setting the corresponding control bit in the |
1990 | * config space. | 1953 | * config space. |