Commit b0825488 authored by Matthew Garrett's avatar Matthew Garrett Committed by Linus Torvalds

[PATCH] agp: restore APBASE after setting APSIZE

When leaving S3 state, the AGP bridge may not have all PCI configuration
registers set in the same way as they were at boot.  This should be fixed
by pci_restore_state - however, the APBASE register cannot be set to
conflict with the APSIZE register.  If APSIZE is larger than it was before
suspend, pci_restore_state will not restore APBASE correctly.  The attached
patch adds an extra item to the agp_bridge_data structure and uses it to
store the value of APBASE.  On resume, this is then written after APSIZE
has been set.  This patch only touches the path used for Intel chipsets
without integrated graphics, and may need to be extended to work with the
others.

Without this patch, I get the symptoms described in bug 4921 - APBASE ends
up overlapping various PCI devices, and as a result they fail to work after
resume.
Signed-off-by: default avatarMatthew Garrett <mjg59@srcf.ucam.org>
Acked-by: default avatarDave Jones <davej@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b87a1e50
...@@ -143,6 +143,7 @@ struct agp_bridge_data { ...@@ -143,6 +143,7 @@ struct agp_bridge_data {
char major_version; char major_version;
char minor_version; char minor_version;
struct list_head list; struct list_head list;
u32 apbase_config;
}; };
#define KB(x) ((x) * 1024) #define KB(x) ((x) * 1024)
......
...@@ -1047,9 +1047,15 @@ static int intel_845_configure(void) ...@@ -1047,9 +1047,15 @@ static int intel_845_configure(void)
/* aperture size */ /* aperture size */
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value); pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
/* address to map to */ if (agp_bridge->apbase_config != 0) {
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp); pci_write_config_dword(agp_bridge->dev, AGP_APBASE,
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); agp_bridge->apbase_config);
} else {
/* address to map to */
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
agp_bridge->apbase_config = temp;
}
/* attbase - aperture base */ /* attbase - aperture base */
pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr); pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment