diff options
| -rw-r--r-- | arch/x86/include/asm/amd_iommu.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/amd_iommu_proto.h | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/amd_iommu_types.h | 23 | ||||
| -rw-r--r-- | arch/x86/include/asm/gart.h | 15 | ||||
| -rw-r--r-- | arch/x86/kernel/amd_iommu.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/amd_iommu_init.c | 124 | ||||
| -rw-r--r-- | arch/x86/kernel/aperture_64.c | 18 | ||||
| -rw-r--r-- | arch/x86/kernel/pci-gart_64.c | 2 | ||||
| -rw-r--r-- | drivers/char/agp/amd64-agp.c | 4 | ||||
| -rw-r--r-- | drivers/char/agp/generic.c | 4 |
10 files changed, 158 insertions, 38 deletions
diff --git a/arch/x86/include/asm/amd_iommu.h b/arch/x86/include/asm/amd_iommu.h index 5af2982133b5..f16a2caca1e0 100644 --- a/arch/x86/include/asm/amd_iommu.h +++ b/arch/x86/include/asm/amd_iommu.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2007-2009 Advanced Micro Devices, Inc. | 2 | * Copyright (C) 2007-2010 Advanced Micro Devices, Inc. |
| 3 | * Author: Joerg Roedel <joerg.roedel@amd.com> | 3 | * Author: Joerg Roedel <joerg.roedel@amd.com> |
| 4 | * Leo Duran <leo.duran@amd.com> | 4 | * Leo Duran <leo.duran@amd.com> |
| 5 | * | 5 | * |
diff --git a/arch/x86/include/asm/amd_iommu_proto.h b/arch/x86/include/asm/amd_iommu_proto.h index cb030374b90a..916bc8111a01 100644 --- a/arch/x86/include/asm/amd_iommu_proto.h +++ b/arch/x86/include/asm/amd_iommu_proto.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2009 Advanced Micro Devices, Inc. | 2 | * Copyright (C) 2009-2010 Advanced Micro Devices, Inc. |
| 3 | * Author: Joerg Roedel <joerg.roedel@amd.com> | 3 | * Author: Joerg Roedel <joerg.roedel@amd.com> |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify it | 5 | * This program is free software; you can redistribute it and/or modify it |
diff --git a/arch/x86/include/asm/amd_iommu_types.h b/arch/x86/include/asm/amd_iommu_types.h index 08616180deaf..e3509fc303bf 100644 --- a/arch/x86/include/asm/amd_iommu_types.h +++ b/arch/x86/include/asm/amd_iommu_types.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2007-2009 Advanced Micro Devices, Inc. | 2 | * Copyright (C) 2007-2010 Advanced Micro Devices, Inc. |
| 3 | * Author: Joerg Roedel <joerg.roedel@amd.com> | 3 | * Author: Joerg Roedel <joerg.roedel@amd.com> |
| 4 | * Leo Duran <leo.duran@amd.com> | 4 | * Leo Duran <leo.duran@amd.com> |
| 5 | * | 5 | * |
| @@ -416,13 +416,22 @@ struct amd_iommu { | |||
| 416 | struct dma_ops_domain *default_dom; | 416 | struct dma_ops_domain *default_dom; |
| 417 | 417 | ||
| 418 | /* | 418 | /* |
| 419 | * This array is required to work around a potential BIOS bug. | 419 | * We can't rely on the BIOS to restore all values on reinit, so we |
| 420 | * The BIOS may miss to restore parts of the PCI configuration | 420 | * need to stash them |
| 421 | * space when the system resumes from S3. The result is that the | ||
| 422 | * IOMMU does not execute commands anymore which leads to system | ||
| 423 | * failure. | ||
| 424 | */ | 421 | */ |
| 425 | u32 cache_cfg[4]; | 422 | |
| 423 | /* The iommu BAR */ | ||
| 424 | u32 stored_addr_lo; | ||
| 425 | u32 stored_addr_hi; | ||
| 426 | |||
| 427 | /* | ||
| 428 | * Each iommu has 6 l1s, each of which is documented as having 0x12 | ||
| 429 | * registers | ||
| 430 | */ | ||
| 431 | u32 stored_l1[6][0x12]; | ||
| 432 | |||
| 433 | /* The l2 indirect registers */ | ||
| 434 | u32 stored_l2[0x83]; | ||
| 426 | }; | 435 | }; |
| 427 | 436 | ||
| 428 | /* | 437 | /* |
diff --git a/arch/x86/include/asm/gart.h b/arch/x86/include/asm/gart.h index 4ac5b0f33fc1..bf357f9b25f0 100644 --- a/arch/x86/include/asm/gart.h +++ b/arch/x86/include/asm/gart.h | |||
| @@ -17,6 +17,7 @@ extern int fix_aperture; | |||
| 17 | #define GARTEN (1<<0) | 17 | #define GARTEN (1<<0) |
| 18 | #define DISGARTCPU (1<<4) | 18 | #define DISGARTCPU (1<<4) |
| 19 | #define DISGARTIO (1<<5) | 19 | #define DISGARTIO (1<<5) |
| 20 | #define DISTLBWALKPRB (1<<6) | ||
| 20 | 21 | ||
| 21 | /* GART cache control register bits. */ | 22 | /* GART cache control register bits. */ |
| 22 | #define INVGART (1<<0) | 23 | #define INVGART (1<<0) |
| @@ -27,7 +28,6 @@ extern int fix_aperture; | |||
| 27 | #define AMD64_GARTAPERTUREBASE 0x94 | 28 | #define AMD64_GARTAPERTUREBASE 0x94 |
| 28 | #define AMD64_GARTTABLEBASE 0x98 | 29 | #define AMD64_GARTTABLEBASE 0x98 |
| 29 | #define AMD64_GARTCACHECTL 0x9c | 30 | #define AMD64_GARTCACHECTL 0x9c |
| 30 | #define AMD64_GARTEN (1<<0) | ||
| 31 | 31 | ||
| 32 | #ifdef CONFIG_GART_IOMMU | 32 | #ifdef CONFIG_GART_IOMMU |
| 33 | extern int gart_iommu_aperture; | 33 | extern int gart_iommu_aperture; |
| @@ -57,6 +57,19 @@ static inline void gart_iommu_hole_init(void) | |||
| 57 | 57 | ||
| 58 | extern int agp_amd64_init(void); | 58 | extern int agp_amd64_init(void); |
| 59 | 59 | ||
| 60 | static inline void gart_set_size_and_enable(struct pci_dev *dev, u32 order) | ||
| 61 | { | ||
| 62 | u32 ctl; | ||
| 63 | |||
| 64 | /* | ||
| 65 | * Don't enable translation but enable GART IO and CPU accesses. | ||
| 66 | * Also, set DISTLBWALKPRB since GART tables memory is UC. | ||
| 67 | */ | ||
| 68 | ctl = DISTLBWALKPRB | order << 1; | ||
| 69 | |||
| 70 | pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, ctl); | ||
| 71 | } | ||
| 72 | |||
| 60 | static inline void enable_gart_translation(struct pci_dev *dev, u64 addr) | 73 | static inline void enable_gart_translation(struct pci_dev *dev, u64 addr) |
| 61 | { | 74 | { |
| 62 | u32 tmp, ctl; | 75 | u32 tmp, ctl; |
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 679b6450382b..d2fdb0826df2 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2007-2009 Advanced Micro Devices, Inc. | 2 | * Copyright (C) 2007-2010 Advanced Micro Devices, Inc. |
| 3 | * Author: Joerg Roedel <joerg.roedel@amd.com> | 3 | * Author: Joerg Roedel <joerg.roedel@amd.com> |
| 4 | * Leo Duran <leo.duran@amd.com> | 4 | * Leo Duran <leo.duran@amd.com> |
| 5 | * | 5 | * |
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 5a170cbbbed8..3cb482e123de 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2007-2009 Advanced Micro Devices, Inc. | 2 | * Copyright (C) 2007-2010 Advanced Micro Devices, Inc. |
| 3 | * Author: Joerg Roedel <joerg.roedel@amd.com> | 3 | * Author: Joerg Roedel <joerg.roedel@amd.com> |
| 4 | * Leo Duran <leo.duran@amd.com> | 4 | * Leo Duran <leo.duran@amd.com> |
| 5 | * | 5 | * |
| @@ -194,6 +194,39 @@ static inline unsigned long tbl_size(int entry_size) | |||
| 194 | return 1UL << shift; | 194 | return 1UL << shift; |
| 195 | } | 195 | } |
| 196 | 196 | ||
| 197 | /* Access to l1 and l2 indexed register spaces */ | ||
| 198 | |||
| 199 | static u32 iommu_read_l1(struct amd_iommu *iommu, u16 l1, u8 address) | ||
| 200 | { | ||
| 201 | u32 val; | ||
| 202 | |||
| 203 | pci_write_config_dword(iommu->dev, 0xf8, (address | l1 << 16)); | ||
| 204 | pci_read_config_dword(iommu->dev, 0xfc, &val); | ||
| 205 | return val; | ||
| 206 | } | ||
| 207 | |||
| 208 | static void iommu_write_l1(struct amd_iommu *iommu, u16 l1, u8 address, u32 val) | ||
| 209 | { | ||
| 210 | pci_write_config_dword(iommu->dev, 0xf8, (address | l1 << 16 | 1 << 31)); | ||
| 211 | pci_write_config_dword(iommu->dev, 0xfc, val); | ||
| 212 | pci_write_config_dword(iommu->dev, 0xf8, (address | l1 << 16)); | ||
| 213 | } | ||
| 214 | |||
| 215 | static u32 iommu_read_l2(struct amd_iommu *iommu, u8 address) | ||
| 216 | { | ||
| 217 | u32 val; | ||
| 218 | |||
| 219 | pci_write_config_dword(iommu->dev, 0xf0, address); | ||
| 220 | pci_read_config_dword(iommu->dev, 0xf4, &val); | ||
| 221 | return val; | ||
| 222 | } | ||
| 223 | |||
| 224 | static void iommu_write_l2(struct amd_iommu *iommu, u8 address, u32 val) | ||
| 225 | { | ||
| 226 | pci_write_config_dword(iommu->dev, 0xf0, (address | 1 << 8)); | ||
| 227 | pci_write_config_dword(iommu->dev, 0xf4, val); | ||
| 228 | } | ||
| 229 | |||
| 197 | /**************************************************************************** | 230 | /**************************************************************************** |
| 198 | * | 231 | * |
| 199 | * AMD IOMMU MMIO register space handling functions | 232 | * AMD IOMMU MMIO register space handling functions |
| @@ -619,6 +652,7 @@ static void __init init_iommu_from_pci(struct amd_iommu *iommu) | |||
| 619 | { | 652 | { |
| 620 | int cap_ptr = iommu->cap_ptr; | 653 | int cap_ptr = iommu->cap_ptr; |
| 621 | u32 range, misc; | 654 | u32 range, misc; |
| 655 | int i, j; | ||
| 622 | 656 | ||
| 623 | pci_read_config_dword(iommu->dev, cap_ptr + MMIO_CAP_HDR_OFFSET, | 657 | pci_read_config_dword(iommu->dev, cap_ptr + MMIO_CAP_HDR_OFFSET, |
| 624 | &iommu->cap); | 658 | &iommu->cap); |
| @@ -633,12 +667,29 @@ static void __init init_iommu_from_pci(struct amd_iommu *iommu) | |||
| 633 | MMIO_GET_LD(range)); | 667 | MMIO_GET_LD(range)); |
| 634 | iommu->evt_msi_num = MMIO_MSI_NUM(misc); | 668 | iommu->evt_msi_num = MMIO_MSI_NUM(misc); |
| 635 | 669 | ||
| 636 | if (is_rd890_iommu(iommu->dev)) { | 670 | if (!is_rd890_iommu(iommu->dev)) |
| 637 | pci_read_config_dword(iommu->dev, 0xf0, &iommu->cache_cfg[0]); | 671 | return; |
| 638 | pci_read_config_dword(iommu->dev, 0xf4, &iommu->cache_cfg[1]); | 672 | |
| 639 | pci_read_config_dword(iommu->dev, 0xf8, &iommu->cache_cfg[2]); | 673 | /* |
| 640 | pci_read_config_dword(iommu->dev, 0xfc, &iommu->cache_cfg[3]); | 674 | * Some rd890 systems may not be fully reconfigured by the BIOS, so |
| 641 | } | 675 | * it's necessary for us to store this information so it can be |
| 676 | * reprogrammed on resume | ||
| 677 | */ | ||
| 678 | |||
| 679 | pci_read_config_dword(iommu->dev, iommu->cap_ptr + 4, | ||
| 680 | &iommu->stored_addr_lo); | ||
| 681 | pci_read_config_dword(iommu->dev, iommu->cap_ptr + 8, | ||
| 682 | &iommu->stored_addr_hi); | ||
| 683 | |||
| 684 | /* Low bit locks writes to configuration space */ | ||
| 685 | iommu->stored_addr_lo &= ~1; | ||
| 686 | |||
| 687 | for (i = 0; i < 6; i++) | ||
| 688 | for (j = 0; j < 0x12; j++) | ||
| 689 | iommu->stored_l1[i][j] = iommu_read_l1(iommu, i, j); | ||
| 690 | |||
| 691 | for (i = 0; i < 0x83; i++) | ||
| 692 | iommu->stored_l2[i] = iommu_read_l2(iommu, i); | ||
| 642 | } | 693 | } |
| 643 | 694 | ||
| 644 | /* | 695 | /* |
| @@ -1127,14 +1178,53 @@ static void iommu_init_flags(struct amd_iommu *iommu) | |||
| 1127 | iommu_feature_enable(iommu, CONTROL_COHERENT_EN); | 1178 | iommu_feature_enable(iommu, CONTROL_COHERENT_EN); |
| 1128 | } | 1179 | } |
| 1129 | 1180 | ||
| 1130 | static void iommu_apply_quirks(struct amd_iommu *iommu) | 1181 | static void iommu_apply_resume_quirks(struct amd_iommu *iommu) |
| 1131 | { | 1182 | { |
| 1132 | if (is_rd890_iommu(iommu->dev)) { | 1183 | int i, j; |
| 1133 | pci_write_config_dword(iommu->dev, 0xf0, iommu->cache_cfg[0]); | 1184 | u32 ioc_feature_control; |
| 1134 | pci_write_config_dword(iommu->dev, 0xf4, iommu->cache_cfg[1]); | 1185 | struct pci_dev *pdev = NULL; |
| 1135 | pci_write_config_dword(iommu->dev, 0xf8, iommu->cache_cfg[2]); | 1186 | |
| 1136 | pci_write_config_dword(iommu->dev, 0xfc, iommu->cache_cfg[3]); | 1187 | /* RD890 BIOSes may not have completely reconfigured the iommu */ |
| 1137 | } | 1188 | if (!is_rd890_iommu(iommu->dev)) |
| 1189 | return; | ||
| 1190 | |||
| 1191 | /* | ||
| 1192 | * First, we need to ensure that the iommu is enabled. This is | ||
| 1193 | * controlled by a register in the northbridge | ||
| 1194 | */ | ||
| 1195 | pdev = pci_get_bus_and_slot(iommu->dev->bus->number, PCI_DEVFN(0, 0)); | ||
| 1196 | |||
| 1197 | if (!pdev) | ||
| 1198 | return; | ||
| 1199 | |||
| 1200 | /* Select Northbridge indirect register 0x75 and enable writing */ | ||
| 1201 | pci_write_config_dword(pdev, 0x60, 0x75 | (1 << 7)); | ||
| 1202 | pci_read_config_dword(pdev, 0x64, &ioc_feature_control); | ||
| 1203 | |||
| 1204 | /* Enable the iommu */ | ||
| 1205 | if (!(ioc_feature_control & 0x1)) | ||
| 1206 | pci_write_config_dword(pdev, 0x64, ioc_feature_control | 1); | ||
| 1207 | |||
| 1208 | pci_dev_put(pdev); | ||
| 1209 | |||
| 1210 | /* Restore the iommu BAR */ | ||
| 1211 | pci_write_config_dword(iommu->dev, iommu->cap_ptr + 4, | ||
| 1212 | iommu->stored_addr_lo); | ||
| 1213 | pci_write_config_dword(iommu->dev, iommu->cap_ptr + 8, | ||
| 1214 | iommu->stored_addr_hi); | ||
| 1215 | |||
| 1216 | /* Restore the l1 indirect regs for each of the 6 l1s */ | ||
| 1217 | for (i = 0; i < 6; i++) | ||
| 1218 | for (j = 0; j < 0x12; j++) | ||
| 1219 | iommu_write_l1(iommu, i, j, iommu->stored_l1[i][j]); | ||
| 1220 | |||
| 1221 | /* Restore the l2 indirect regs */ | ||
| 1222 | for (i = 0; i < 0x83; i++) | ||
| 1223 | iommu_write_l2(iommu, i, iommu->stored_l2[i]); | ||
| 1224 | |||
| 1225 | /* Lock PCI setup registers */ | ||
| 1226 | pci_write_config_dword(iommu->dev, iommu->cap_ptr + 4, | ||
| 1227 | iommu->stored_addr_lo | 1); | ||
| 1138 | } | 1228 | } |
| 1139 | 1229 | ||
| 1140 | /* | 1230 | /* |
| @@ -1147,7 +1237,6 @@ static void enable_iommus(void) | |||
| 1147 | 1237 | ||
| 1148 | for_each_iommu(iommu) { | 1238 | for_each_iommu(iommu) { |
| 1149 | iommu_disable(iommu); | 1239 | iommu_disable(iommu); |
| 1150 | iommu_apply_quirks(iommu); | ||
| 1151 | iommu_init_flags(iommu); | 1240 | iommu_init_flags(iommu); |
| 1152 | iommu_set_device_table(iommu); | 1241 | iommu_set_device_table(iommu); |
| 1153 | iommu_enable_command_buffer(iommu); | 1242 | iommu_enable_command_buffer(iommu); |
| @@ -1173,6 +1262,11 @@ static void disable_iommus(void) | |||
| 1173 | 1262 | ||
| 1174 | static int amd_iommu_resume(struct sys_device *dev) | 1263 | static int amd_iommu_resume(struct sys_device *dev) |
| 1175 | { | 1264 | { |
| 1265 | struct amd_iommu *iommu; | ||
| 1266 | |||
| 1267 | for_each_iommu(iommu) | ||
| 1268 | iommu_apply_resume_quirks(iommu); | ||
| 1269 | |||
| 1176 | /* re-load the hardware */ | 1270 | /* re-load the hardware */ |
| 1177 | enable_iommus(); | 1271 | enable_iommus(); |
| 1178 | 1272 | ||
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c index a2e0caf26e17..c9cb17368448 100644 --- a/arch/x86/kernel/aperture_64.c +++ b/arch/x86/kernel/aperture_64.c | |||
| @@ -307,7 +307,7 @@ void __init early_gart_iommu_check(void) | |||
| 307 | continue; | 307 | continue; |
| 308 | 308 | ||
| 309 | ctl = read_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL); | 309 | ctl = read_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL); |
| 310 | aper_enabled = ctl & AMD64_GARTEN; | 310 | aper_enabled = ctl & GARTEN; |
| 311 | aper_order = (ctl >> 1) & 7; | 311 | aper_order = (ctl >> 1) & 7; |
| 312 | aper_size = (32 * 1024 * 1024) << aper_order; | 312 | aper_size = (32 * 1024 * 1024) << aper_order; |
| 313 | aper_base = read_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE) & 0x7fff; | 313 | aper_base = read_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE) & 0x7fff; |
| @@ -362,7 +362,7 @@ void __init early_gart_iommu_check(void) | |||
| 362 | continue; | 362 | continue; |
| 363 | 363 | ||
| 364 | ctl = read_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL); | 364 | ctl = read_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL); |
| 365 | ctl &= ~AMD64_GARTEN; | 365 | ctl &= ~GARTEN; |
| 366 | write_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL, ctl); | 366 | write_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL, ctl); |
| 367 | } | 367 | } |
| 368 | } | 368 | } |
| @@ -505,8 +505,13 @@ out: | |||
| 505 | 505 | ||
| 506 | /* Fix up the north bridges */ | 506 | /* Fix up the north bridges */ |
| 507 | for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) { | 507 | for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) { |
| 508 | int bus; | 508 | int bus, dev_base, dev_limit; |
| 509 | int dev_base, dev_limit; | 509 | |
| 510 | /* | ||
| 511 | * Don't enable translation yet but enable GART IO and CPU | ||
| 512 | * accesses and set DISTLBWALKPRB since GART table memory is UC. | ||
| 513 | */ | ||
| 514 | u32 ctl = DISTLBWALKPRB | aper_order << 1; | ||
| 510 | 515 | ||
| 511 | bus = bus_dev_ranges[i].bus; | 516 | bus = bus_dev_ranges[i].bus; |
| 512 | dev_base = bus_dev_ranges[i].dev_base; | 517 | dev_base = bus_dev_ranges[i].dev_base; |
| @@ -515,10 +520,7 @@ out: | |||
| 515 | if (!early_is_k8_nb(read_pci_config(bus, slot, 3, 0x00))) | 520 | if (!early_is_k8_nb(read_pci_config(bus, slot, 3, 0x00))) |
| 516 | continue; | 521 | continue; |
| 517 | 522 | ||
| 518 | /* Don't enable translation yet. That is done later. | 523 | write_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL, ctl); |
| 519 | Assume this BIOS didn't initialise the GART so | ||
| 520 | just overwrite all previous bits */ | ||
| 521 | write_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL, aper_order << 1); | ||
| 522 | write_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE, aper_alloc >> 25); | 524 | write_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE, aper_alloc >> 25); |
| 523 | } | 525 | } |
| 524 | } | 526 | } |
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c index 0f7f130caa67..6015ee13e22b 100644 --- a/arch/x86/kernel/pci-gart_64.c +++ b/arch/x86/kernel/pci-gart_64.c | |||
| @@ -601,7 +601,7 @@ static void gart_fixup_northbridges(struct sys_device *dev) | |||
| 601 | * Don't enable translations just yet. That is the next | 601 | * Don't enable translations just yet. That is the next |
| 602 | * step. Restore the pre-suspend aperture settings. | 602 | * step. Restore the pre-suspend aperture settings. |
| 603 | */ | 603 | */ |
| 604 | pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, aperture_order << 1); | 604 | gart_set_size_and_enable(dev, aperture_order); |
| 605 | pci_write_config_dword(dev, AMD64_GARTAPERTUREBASE, aperture_alloc >> 25); | 605 | pci_write_config_dword(dev, AMD64_GARTAPERTUREBASE, aperture_alloc >> 25); |
| 606 | } | 606 | } |
| 607 | } | 607 | } |
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c index 70312da4c968..564808a5c3c0 100644 --- a/drivers/char/agp/amd64-agp.c +++ b/drivers/char/agp/amd64-agp.c | |||
| @@ -199,7 +199,7 @@ static void amd64_cleanup(void) | |||
| 199 | struct pci_dev *dev = k8_northbridges[i]; | 199 | struct pci_dev *dev = k8_northbridges[i]; |
| 200 | /* disable gart translation */ | 200 | /* disable gart translation */ |
| 201 | pci_read_config_dword(dev, AMD64_GARTAPERTURECTL, &tmp); | 201 | pci_read_config_dword(dev, AMD64_GARTAPERTURECTL, &tmp); |
| 202 | tmp &= ~AMD64_GARTEN; | 202 | tmp &= ~GARTEN; |
| 203 | pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, tmp); | 203 | pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, tmp); |
| 204 | } | 204 | } |
| 205 | } | 205 | } |
| @@ -313,7 +313,7 @@ static __devinit int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp, | |||
| 313 | if (order < 0 || !agp_aperture_valid(aper, (32*1024*1024)<<order)) | 313 | if (order < 0 || !agp_aperture_valid(aper, (32*1024*1024)<<order)) |
| 314 | return -1; | 314 | return -1; |
| 315 | 315 | ||
| 316 | pci_write_config_dword(nb, AMD64_GARTAPERTURECTL, order << 1); | 316 | gart_set_size_and_enable(nb, order); |
| 317 | pci_write_config_dword(nb, AMD64_GARTAPERTUREBASE, aper >> 25); | 317 | pci_write_config_dword(nb, AMD64_GARTAPERTUREBASE, aper >> 25); |
| 318 | 318 | ||
| 319 | return 0; | 319 | return 0; |
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c index d2abf5143983..64255cef8a7d 100644 --- a/drivers/char/agp/generic.c +++ b/drivers/char/agp/generic.c | |||
| @@ -984,7 +984,9 @@ int agp_generic_create_gatt_table(struct agp_bridge_data *bridge) | |||
| 984 | 984 | ||
| 985 | bridge->driver->cache_flush(); | 985 | bridge->driver->cache_flush(); |
| 986 | #ifdef CONFIG_X86 | 986 | #ifdef CONFIG_X86 |
| 987 | set_memory_uc((unsigned long)table, 1 << page_order); | 987 | if (set_memory_uc((unsigned long)table, 1 << page_order)) |
| 988 | printk(KERN_WARNING "Could not set GATT table memory to UC!"); | ||
| 989 | |||
| 988 | bridge->gatt_table = (void *)table; | 990 | bridge->gatt_table = (void *)table; |
| 989 | #else | 991 | #else |
| 990 | bridge->gatt_table = ioremap_nocache(virt_to_phys(table), | 992 | bridge->gatt_table = ioremap_nocache(virt_to_phys(table), |
