aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/aperture_64.c14
-rw-r--r--drivers/char/agp/amd64-agp.c11
2 files changed, 25 insertions, 0 deletions
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c
index 479926d9e004..2e93b3132dff 100644
--- a/arch/x86/kernel/aperture_64.c
+++ b/arch/x86/kernel/aperture_64.c
@@ -138,6 +138,7 @@ static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order)
138 int nbits; 138 int nbits;
139 u32 aper_low, aper_hi; 139 u32 aper_low, aper_hi;
140 u64 aper; 140 u64 aper;
141 u32 old_order;
141 142
142 printk(KERN_INFO "AGP bridge at %02x:%02x:%02x\n", num, slot, func); 143 printk(KERN_INFO "AGP bridge at %02x:%02x:%02x\n", num, slot, func);
143 apsizereg = read_pci_config_16(num, slot, func, cap + 0x14); 144 apsizereg = read_pci_config_16(num, slot, func, cap + 0x14);
@@ -146,6 +147,9 @@ static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order)
146 return 0; 147 return 0;
147 } 148 }
148 149
150 /* old_order could be the value from NB gart setting */
151 old_order = *order;
152
149 apsize = apsizereg & 0xfff; 153 apsize = apsizereg & 0xfff;
150 /* Some BIOS use weird encodings not in the AGPv3 table. */ 154 /* Some BIOS use weird encodings not in the AGPv3 table. */
151 if (apsize & 0xff) 155 if (apsize & 0xff)
@@ -159,6 +163,16 @@ static __u32 __init read_agp(int num, int slot, int func, int cap, u32 *order)
159 aper_hi = read_pci_config(num, slot, func, 0x14); 163 aper_hi = read_pci_config(num, slot, func, 0x14);
160 aper = (aper_low & ~((1<<22)-1)) | ((u64)aper_hi << 32); 164 aper = (aper_low & ~((1<<22)-1)) | ((u64)aper_hi << 32);
161 165
166 /*
167 * On some sick chips, APSIZE is 0. It means it wants 4G
168 * so let double check that order, and lets trust AMD NB settings:
169 */
170 if (aper + (32UL<<(20 + *order)) > 0x100000000UL) {
171 printk(KERN_INFO "Aperture size %u MB (APSIZE %x) is not right, using settings from NB\n",
172 32 << *order, apsizereg);
173 *order = old_order;
174 }
175
162 printk(KERN_INFO "Aperture from AGP @ %Lx size %u MB (APSIZE %x)\n", 176 printk(KERN_INFO "Aperture from AGP @ %Lx size %u MB (APSIZE %x)\n",
163 aper, 32 << *order, apsizereg); 177 aper, 32 << *order, apsizereg);
164 178
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c
index 25d64224cdbb..9e3939db76e8 100644
--- a/drivers/char/agp/amd64-agp.c
+++ b/drivers/char/agp/amd64-agp.c
@@ -312,6 +312,17 @@ static __devinit int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp,
312 pci_read_config_dword(agp, 0x10, &aper_low); 312 pci_read_config_dword(agp, 0x10, &aper_low);
313 pci_read_config_dword(agp, 0x14, &aper_hi); 313 pci_read_config_dword(agp, 0x14, &aper_hi);
314 aper = (aper_low & ~((1<<22)-1)) | ((u64)aper_hi << 32); 314 aper = (aper_low & ~((1<<22)-1)) | ((u64)aper_hi << 32);
315
316 /*
317 * On some sick chips APSIZE is 0. This means it wants 4G
318 * so let double check that order, and lets trust the AMD NB settings
319 */
320 if (aper + (32ULL<<(20 + order)) > 0x100000000ULL) {
321 printk(KERN_INFO "Aperture size %u MB is not right, using settings from NB\n",
322 32 << order);
323 order = nb_order;
324 }
325
315 printk(KERN_INFO PFX "Aperture from AGP @ %Lx size %u MB\n", aper, 32 << order); 326 printk(KERN_INFO PFX "Aperture from AGP @ %Lx size %u MB\n", aper, 32 << order);
316 if (order < 0 || !aperture_valid(aper, (32*1024*1024)<<order)) 327 if (order < 0 || !aperture_valid(aper, (32*1024*1024)<<order))
317 return -1; 328 return -1;