diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-04-15 15:20:56 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-04-15 15:20:56 -0400 |
| commit | dc57da3875f527b1cc195ea4ce5bd32e1e68433d (patch) | |
| tree | 4291c437e45d978269c1280c7c4915b45ae6ad2e | |
| parent | 2fed94c032316d89422d4abfca2a882897489b94 (diff) | |
| parent | 2b2f862ee6ef8ae8f913fee6af2112c5ffeedf94 (diff) | |
Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
x86/gart: Disable GART explicitly before initialization
dma-debug: Cleanup for copy-loop in filter_write()
x86/amd-iommu: Remove obsolete parameter documentation
x86/amd-iommu: use for_each_pci_dev
Revert "x86: disable IOMMUs on kernel crash"
x86/amd-iommu: warn when issuing command to uninitialized cmd buffer
x86/amd-iommu: enable iommu before attaching devices
x86/amd-iommu: Use helper function to destroy domain
x86/amd-iommu: Report errors in acpi parsing functions upstream
x86/amd-iommu: Pt mode fix for domain_destroy
x86/amd-iommu: Protect IOMMU-API map/unmap path
x86/amd-iommu: Remove double NULL check in check_device
| -rw-r--r-- | Documentation/kernel-parameters.txt | 5 | ||||
| -rw-r--r-- | arch/x86/include/asm/amd_iommu_types.h | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/amd_iommu.c | 20 | ||||
| -rw-r--r-- | arch/x86/kernel/amd_iommu_init.c | 48 | ||||
| -rw-r--r-- | arch/x86/kernel/aperture_64.c | 15 | ||||
| -rw-r--r-- | arch/x86/kernel/crash.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/pci-gart_64.c | 3 | ||||
| -rw-r--r-- | lib/dma-debug.c | 2 |
8 files changed, 68 insertions, 34 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index e4cbca58536c..e2202e93b148 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -320,11 +320,6 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 320 | amd_iommu= [HW,X86-84] | 320 | amd_iommu= [HW,X86-84] |
| 321 | Pass parameters to the AMD IOMMU driver in the system. | 321 | Pass parameters to the AMD IOMMU driver in the system. |
| 322 | Possible values are: | 322 | Possible values are: |
| 323 | isolate - enable device isolation (each device, as far | ||
| 324 | as possible, will get its own protection | ||
| 325 | domain) [default] | ||
| 326 | share - put every device behind one IOMMU into the | ||
| 327 | same protection domain | ||
| 328 | fullflush - enable flushing of IO/TLB entries when | 323 | fullflush - enable flushing of IO/TLB entries when |
| 329 | they are unmapped. Otherwise they are | 324 | they are unmapped. Otherwise they are |
| 330 | flushed before they will be reused, which | 325 | flushed before they will be reused, which |
diff --git a/arch/x86/include/asm/amd_iommu_types.h b/arch/x86/include/asm/amd_iommu_types.h index ba19ad4c47d0..86a0ff0aeac7 100644 --- a/arch/x86/include/asm/amd_iommu_types.h +++ b/arch/x86/include/asm/amd_iommu_types.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #define _ASM_X86_AMD_IOMMU_TYPES_H | 21 | #define _ASM_X86_AMD_IOMMU_TYPES_H |
| 22 | 22 | ||
| 23 | #include <linux/types.h> | 23 | #include <linux/types.h> |
| 24 | #include <linux/mutex.h> | ||
| 24 | #include <linux/list.h> | 25 | #include <linux/list.h> |
| 25 | #include <linux/spinlock.h> | 26 | #include <linux/spinlock.h> |
| 26 | 27 | ||
| @@ -140,6 +141,7 @@ | |||
| 140 | 141 | ||
| 141 | /* constants to configure the command buffer */ | 142 | /* constants to configure the command buffer */ |
| 142 | #define CMD_BUFFER_SIZE 8192 | 143 | #define CMD_BUFFER_SIZE 8192 |
| 144 | #define CMD_BUFFER_UNINITIALIZED 1 | ||
| 143 | #define CMD_BUFFER_ENTRIES 512 | 145 | #define CMD_BUFFER_ENTRIES 512 |
| 144 | #define MMIO_CMD_SIZE_SHIFT 56 | 146 | #define MMIO_CMD_SIZE_SHIFT 56 |
| 145 | #define MMIO_CMD_SIZE_512 (0x9ULL << MMIO_CMD_SIZE_SHIFT) | 147 | #define MMIO_CMD_SIZE_512 (0x9ULL << MMIO_CMD_SIZE_SHIFT) |
| @@ -237,6 +239,7 @@ struct protection_domain { | |||
| 237 | struct list_head list; /* for list of all protection domains */ | 239 | struct list_head list; /* for list of all protection domains */ |
| 238 | struct list_head dev_list; /* List of all devices in this domain */ | 240 | struct list_head dev_list; /* List of all devices in this domain */ |
| 239 | spinlock_t lock; /* mostly used to lock the page table*/ | 241 | spinlock_t lock; /* mostly used to lock the page table*/ |
| 242 | struct mutex api_lock; /* protect page tables in the iommu-api path */ | ||
| 240 | u16 id; /* the domain id written to the device table */ | 243 | u16 id; /* the domain id written to the device table */ |
| 241 | int mode; /* paging mode (0-6 levels) */ | 244 | int mode; /* paging mode (0-6 levels) */ |
| 242 | u64 *pt_root; /* page table root pointer */ | 245 | u64 *pt_root; /* page table root pointer */ |
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index f3dadb571d9b..f854d89b7edf 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
| @@ -118,7 +118,7 @@ static bool check_device(struct device *dev) | |||
| 118 | return false; | 118 | return false; |
| 119 | 119 | ||
| 120 | /* No device or no PCI device */ | 120 | /* No device or no PCI device */ |
| 121 | if (!dev || dev->bus != &pci_bus_type) | 121 | if (dev->bus != &pci_bus_type) |
| 122 | return false; | 122 | return false; |
| 123 | 123 | ||
| 124 | devid = get_device_id(dev); | 124 | devid = get_device_id(dev); |
| @@ -392,6 +392,7 @@ static int __iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd) | |||
| 392 | u32 tail, head; | 392 | u32 tail, head; |
| 393 | u8 *target; | 393 | u8 *target; |
| 394 | 394 | ||
| 395 | WARN_ON(iommu->cmd_buf_size & CMD_BUFFER_UNINITIALIZED); | ||
| 395 | tail = readl(iommu->mmio_base + MMIO_CMD_TAIL_OFFSET); | 396 | tail = readl(iommu->mmio_base + MMIO_CMD_TAIL_OFFSET); |
| 396 | target = iommu->cmd_buf + tail; | 397 | target = iommu->cmd_buf + tail; |
| 397 | memcpy_toio(target, cmd, sizeof(*cmd)); | 398 | memcpy_toio(target, cmd, sizeof(*cmd)); |
| @@ -2186,7 +2187,7 @@ static void prealloc_protection_domains(void) | |||
| 2186 | struct dma_ops_domain *dma_dom; | 2187 | struct dma_ops_domain *dma_dom; |
| 2187 | u16 devid; | 2188 | u16 devid; |
| 2188 | 2189 | ||
| 2189 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | 2190 | for_each_pci_dev(dev) { |
| 2190 | 2191 | ||
| 2191 | /* Do we handle this device? */ | 2192 | /* Do we handle this device? */ |
| 2192 | if (!check_device(&dev->dev)) | 2193 | if (!check_device(&dev->dev)) |
| @@ -2298,7 +2299,7 @@ static void cleanup_domain(struct protection_domain *domain) | |||
| 2298 | list_for_each_entry_safe(dev_data, next, &domain->dev_list, list) { | 2299 | list_for_each_entry_safe(dev_data, next, &domain->dev_list, list) { |
| 2299 | struct device *dev = dev_data->dev; | 2300 | struct device *dev = dev_data->dev; |
| 2300 | 2301 | ||
| 2301 | do_detach(dev); | 2302 | __detach_device(dev); |
| 2302 | atomic_set(&dev_data->bind, 0); | 2303 | atomic_set(&dev_data->bind, 0); |
| 2303 | } | 2304 | } |
| 2304 | 2305 | ||
| @@ -2327,6 +2328,7 @@ static struct protection_domain *protection_domain_alloc(void) | |||
| 2327 | return NULL; | 2328 | return NULL; |
| 2328 | 2329 | ||
| 2329 | spin_lock_init(&domain->lock); | 2330 | spin_lock_init(&domain->lock); |
| 2331 | mutex_init(&domain->api_lock); | ||
| 2330 | domain->id = domain_id_alloc(); | 2332 | domain->id = domain_id_alloc(); |
| 2331 | if (!domain->id) | 2333 | if (!domain->id) |
| 2332 | goto out_err; | 2334 | goto out_err; |
| @@ -2379,9 +2381,7 @@ static void amd_iommu_domain_destroy(struct iommu_domain *dom) | |||
| 2379 | 2381 | ||
| 2380 | free_pagetable(domain); | 2382 | free_pagetable(domain); |
| 2381 | 2383 | ||
| 2382 | domain_id_free(domain->id); | 2384 | protection_domain_free(domain); |
| 2383 | |||
| 2384 | kfree(domain); | ||
| 2385 | 2385 | ||
| 2386 | dom->priv = NULL; | 2386 | dom->priv = NULL; |
| 2387 | } | 2387 | } |
| @@ -2456,6 +2456,8 @@ static int amd_iommu_map_range(struct iommu_domain *dom, | |||
| 2456 | iova &= PAGE_MASK; | 2456 | iova &= PAGE_MASK; |
| 2457 | paddr &= PAGE_MASK; | 2457 | paddr &= PAGE_MASK; |
| 2458 | 2458 | ||
| 2459 | mutex_lock(&domain->api_lock); | ||
| 2460 | |||
| 2459 | for (i = 0; i < npages; ++i) { | 2461 | for (i = 0; i < npages; ++i) { |
| 2460 | ret = iommu_map_page(domain, iova, paddr, prot, PM_MAP_4k); | 2462 | ret = iommu_map_page(domain, iova, paddr, prot, PM_MAP_4k); |
| 2461 | if (ret) | 2463 | if (ret) |
| @@ -2465,6 +2467,8 @@ static int amd_iommu_map_range(struct iommu_domain *dom, | |||
| 2465 | paddr += PAGE_SIZE; | 2467 | paddr += PAGE_SIZE; |
| 2466 | } | 2468 | } |
| 2467 | 2469 | ||
| 2470 | mutex_unlock(&domain->api_lock); | ||
| 2471 | |||
| 2468 | return 0; | 2472 | return 0; |
| 2469 | } | 2473 | } |
| 2470 | 2474 | ||
| @@ -2477,12 +2481,16 @@ static void amd_iommu_unmap_range(struct iommu_domain *dom, | |||
| 2477 | 2481 | ||
| 2478 | iova &= PAGE_MASK; | 2482 | iova &= PAGE_MASK; |
| 2479 | 2483 | ||
| 2484 | mutex_lock(&domain->api_lock); | ||
| 2485 | |||
| 2480 | for (i = 0; i < npages; ++i) { | 2486 | for (i = 0; i < npages; ++i) { |
| 2481 | iommu_unmap_page(domain, iova, PM_MAP_4k); | 2487 | iommu_unmap_page(domain, iova, PM_MAP_4k); |
| 2482 | iova += PAGE_SIZE; | 2488 | iova += PAGE_SIZE; |
| 2483 | } | 2489 | } |
| 2484 | 2490 | ||
| 2485 | iommu_flush_tlb_pde(domain); | 2491 | iommu_flush_tlb_pde(domain); |
| 2492 | |||
| 2493 | mutex_unlock(&domain->api_lock); | ||
| 2486 | } | 2494 | } |
| 2487 | 2495 | ||
| 2488 | static phys_addr_t amd_iommu_iova_to_phys(struct iommu_domain *dom, | 2496 | static phys_addr_t amd_iommu_iova_to_phys(struct iommu_domain *dom, |
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 42f5350b908f..6360abf993d4 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
| @@ -138,9 +138,9 @@ int amd_iommus_present; | |||
| 138 | bool amd_iommu_np_cache __read_mostly; | 138 | bool amd_iommu_np_cache __read_mostly; |
| 139 | 139 | ||
| 140 | /* | 140 | /* |
| 141 | * Set to true if ACPI table parsing and hardware intialization went properly | 141 | * The ACPI table parsing functions set this variable on an error |
| 142 | */ | 142 | */ |
| 143 | static bool amd_iommu_initialized; | 143 | static int __initdata amd_iommu_init_err; |
| 144 | 144 | ||
| 145 | /* | 145 | /* |
| 146 | * List of protection domains - used during resume | 146 | * List of protection domains - used during resume |
| @@ -391,9 +391,11 @@ static int __init find_last_devid_acpi(struct acpi_table_header *table) | |||
| 391 | */ | 391 | */ |
| 392 | for (i = 0; i < table->length; ++i) | 392 | for (i = 0; i < table->length; ++i) |
| 393 | checksum += p[i]; | 393 | checksum += p[i]; |
| 394 | if (checksum != 0) | 394 | if (checksum != 0) { |
| 395 | /* ACPI table corrupt */ | 395 | /* ACPI table corrupt */ |
| 396 | return -ENODEV; | 396 | amd_iommu_init_err = -ENODEV; |
| 397 | return 0; | ||
| 398 | } | ||
| 397 | 399 | ||
| 398 | p += IVRS_HEADER_LENGTH; | 400 | p += IVRS_HEADER_LENGTH; |
| 399 | 401 | ||
| @@ -436,7 +438,7 @@ static u8 * __init alloc_command_buffer(struct amd_iommu *iommu) | |||
| 436 | if (cmd_buf == NULL) | 438 | if (cmd_buf == NULL) |
| 437 | return NULL; | 439 | return NULL; |
| 438 | 440 | ||
| 439 | iommu->cmd_buf_size = CMD_BUFFER_SIZE; | 441 | iommu->cmd_buf_size = CMD_BUFFER_SIZE | CMD_BUFFER_UNINITIALIZED; |
| 440 | 442 | ||
| 441 | return cmd_buf; | 443 | return cmd_buf; |
| 442 | } | 444 | } |
| @@ -472,12 +474,13 @@ static void iommu_enable_command_buffer(struct amd_iommu *iommu) | |||
| 472 | &entry, sizeof(entry)); | 474 | &entry, sizeof(entry)); |
| 473 | 475 | ||
| 474 | amd_iommu_reset_cmd_buffer(iommu); | 476 | amd_iommu_reset_cmd_buffer(iommu); |
| 477 | iommu->cmd_buf_size &= ~(CMD_BUFFER_UNINITIALIZED); | ||
| 475 | } | 478 | } |
| 476 | 479 | ||
| 477 | static void __init free_command_buffer(struct amd_iommu *iommu) | 480 | static void __init free_command_buffer(struct amd_iommu *iommu) |
| 478 | { | 481 | { |
| 479 | free_pages((unsigned long)iommu->cmd_buf, | 482 | free_pages((unsigned long)iommu->cmd_buf, |
| 480 | get_order(iommu->cmd_buf_size)); | 483 | get_order(iommu->cmd_buf_size & ~(CMD_BUFFER_UNINITIALIZED))); |
| 481 | } | 484 | } |
| 482 | 485 | ||
| 483 | /* allocates the memory where the IOMMU will log its events to */ | 486 | /* allocates the memory where the IOMMU will log its events to */ |
| @@ -920,11 +923,16 @@ static int __init init_iommu_all(struct acpi_table_header *table) | |||
| 920 | h->mmio_phys); | 923 | h->mmio_phys); |
| 921 | 924 | ||
| 922 | iommu = kzalloc(sizeof(struct amd_iommu), GFP_KERNEL); | 925 | iommu = kzalloc(sizeof(struct amd_iommu), GFP_KERNEL); |
| 923 | if (iommu == NULL) | 926 | if (iommu == NULL) { |
| 924 | return -ENOMEM; | 927 | amd_iommu_init_err = -ENOMEM; |
| 928 | return 0; | ||
| 929 | } | ||
| 930 | |||
| 925 | ret = init_iommu_one(iommu, h); | 931 | ret = init_iommu_one(iommu, h); |
| 926 | if (ret) | 932 | if (ret) { |
| 927 | return ret; | 933 | amd_iommu_init_err = ret; |
| 934 | return 0; | ||
| 935 | } | ||
| 928 | break; | 936 | break; |
| 929 | default: | 937 | default: |
| 930 | break; | 938 | break; |
| @@ -934,8 +942,6 @@ static int __init init_iommu_all(struct acpi_table_header *table) | |||
| 934 | } | 942 | } |
| 935 | WARN_ON(p != end); | 943 | WARN_ON(p != end); |
| 936 | 944 | ||
| 937 | amd_iommu_initialized = true; | ||
| 938 | |||
| 939 | return 0; | 945 | return 0; |
| 940 | } | 946 | } |
| 941 | 947 | ||
| @@ -1211,6 +1217,10 @@ static int __init amd_iommu_init(void) | |||
| 1211 | if (acpi_table_parse("IVRS", find_last_devid_acpi) != 0) | 1217 | if (acpi_table_parse("IVRS", find_last_devid_acpi) != 0) |
| 1212 | return -ENODEV; | 1218 | return -ENODEV; |
| 1213 | 1219 | ||
| 1220 | ret = amd_iommu_init_err; | ||
| 1221 | if (ret) | ||
| 1222 | goto out; | ||
| 1223 | |||
| 1214 | dev_table_size = tbl_size(DEV_TABLE_ENTRY_SIZE); | 1224 | dev_table_size = tbl_size(DEV_TABLE_ENTRY_SIZE); |
| 1215 | alias_table_size = tbl_size(ALIAS_TABLE_ENTRY_SIZE); | 1225 | alias_table_size = tbl_size(ALIAS_TABLE_ENTRY_SIZE); |
| 1216 | rlookup_table_size = tbl_size(RLOOKUP_TABLE_ENTRY_SIZE); | 1226 | rlookup_table_size = tbl_size(RLOOKUP_TABLE_ENTRY_SIZE); |
| @@ -1270,12 +1280,19 @@ static int __init amd_iommu_init(void) | |||
| 1270 | if (acpi_table_parse("IVRS", init_iommu_all) != 0) | 1280 | if (acpi_table_parse("IVRS", init_iommu_all) != 0) |
| 1271 | goto free; | 1281 | goto free; |
| 1272 | 1282 | ||
| 1273 | if (!amd_iommu_initialized) | 1283 | if (amd_iommu_init_err) { |
| 1284 | ret = amd_iommu_init_err; | ||
| 1274 | goto free; | 1285 | goto free; |
| 1286 | } | ||
| 1275 | 1287 | ||
| 1276 | if (acpi_table_parse("IVRS", init_memory_definitions) != 0) | 1288 | if (acpi_table_parse("IVRS", init_memory_definitions) != 0) |
| 1277 | goto free; | 1289 | goto free; |
| 1278 | 1290 | ||
| 1291 | if (amd_iommu_init_err) { | ||
| 1292 | ret = amd_iommu_init_err; | ||
| 1293 | goto free; | ||
| 1294 | } | ||
| 1295 | |||
| 1279 | ret = sysdev_class_register(&amd_iommu_sysdev_class); | 1296 | ret = sysdev_class_register(&amd_iommu_sysdev_class); |
| 1280 | if (ret) | 1297 | if (ret) |
| 1281 | goto free; | 1298 | goto free; |
| @@ -1288,6 +1305,8 @@ static int __init amd_iommu_init(void) | |||
| 1288 | if (ret) | 1305 | if (ret) |
| 1289 | goto free; | 1306 | goto free; |
| 1290 | 1307 | ||
| 1308 | enable_iommus(); | ||
| 1309 | |||
| 1291 | if (iommu_pass_through) | 1310 | if (iommu_pass_through) |
| 1292 | ret = amd_iommu_init_passthrough(); | 1311 | ret = amd_iommu_init_passthrough(); |
| 1293 | else | 1312 | else |
| @@ -1300,8 +1319,6 @@ static int __init amd_iommu_init(void) | |||
| 1300 | 1319 | ||
| 1301 | amd_iommu_init_notifier(); | 1320 | amd_iommu_init_notifier(); |
| 1302 | 1321 | ||
| 1303 | enable_iommus(); | ||
| 1304 | |||
| 1305 | if (iommu_pass_through) | 1322 | if (iommu_pass_through) |
| 1306 | goto out; | 1323 | goto out; |
| 1307 | 1324 | ||
| @@ -1315,6 +1332,7 @@ out: | |||
| 1315 | return ret; | 1332 | return ret; |
| 1316 | 1333 | ||
| 1317 | free: | 1334 | free: |
| 1335 | disable_iommus(); | ||
| 1318 | 1336 | ||
| 1319 | amd_iommu_uninit_devices(); | 1337 | amd_iommu_uninit_devices(); |
| 1320 | 1338 | ||
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c index 3704997e8b25..b5d8b0bcf235 100644 --- a/arch/x86/kernel/aperture_64.c +++ b/arch/x86/kernel/aperture_64.c | |||
| @@ -393,6 +393,7 @@ void __init gart_iommu_hole_init(void) | |||
| 393 | for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) { | 393 | for (i = 0; i < ARRAY_SIZE(bus_dev_ranges); i++) { |
| 394 | int bus; | 394 | int bus; |
| 395 | int dev_base, dev_limit; | 395 | int dev_base, dev_limit; |
| 396 | u32 ctl; | ||
| 396 | 397 | ||
| 397 | bus = bus_dev_ranges[i].bus; | 398 | bus = bus_dev_ranges[i].bus; |
| 398 | dev_base = bus_dev_ranges[i].dev_base; | 399 | dev_base = bus_dev_ranges[i].dev_base; |
| @@ -406,7 +407,19 @@ void __init gart_iommu_hole_init(void) | |||
| 406 | gart_iommu_aperture = 1; | 407 | gart_iommu_aperture = 1; |
| 407 | x86_init.iommu.iommu_init = gart_iommu_init; | 408 | x86_init.iommu.iommu_init = gart_iommu_init; |
| 408 | 409 | ||
| 409 | aper_order = (read_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL) >> 1) & 7; | 410 | ctl = read_pci_config(bus, slot, 3, |
| 411 | AMD64_GARTAPERTURECTL); | ||
| 412 | |||
| 413 | /* | ||
| 414 | * Before we do anything else disable the GART. It may | ||
| 415 | * still be enabled if we boot into a crash-kernel here. | ||
| 416 | * Reconfiguring the GART while it is enabled could have | ||
| 417 | * unknown side-effects. | ||
| 418 | */ | ||
| 419 | ctl &= ~GARTEN; | ||
| 420 | write_pci_config(bus, slot, 3, AMD64_GARTAPERTURECTL, ctl); | ||
| 421 | |||
| 422 | aper_order = (ctl >> 1) & 7; | ||
| 410 | aper_size = (32 * 1024 * 1024) << aper_order; | 423 | aper_size = (32 * 1024 * 1024) << aper_order; |
| 411 | aper_base = read_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE) & 0x7fff; | 424 | aper_base = read_pci_config(bus, slot, 3, AMD64_GARTAPERTUREBASE) & 0x7fff; |
| 412 | aper_base <<= 25; | 425 | aper_base <<= 25; |
diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c index a4849c10a77e..ebd4c51d096a 100644 --- a/arch/x86/kernel/crash.c +++ b/arch/x86/kernel/crash.c | |||
| @@ -27,7 +27,6 @@ | |||
| 27 | #include <asm/cpu.h> | 27 | #include <asm/cpu.h> |
| 28 | #include <asm/reboot.h> | 28 | #include <asm/reboot.h> |
| 29 | #include <asm/virtext.h> | 29 | #include <asm/virtext.h> |
| 30 | #include <asm/x86_init.h> | ||
| 31 | 30 | ||
| 32 | #if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC) | 31 | #if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC) |
| 33 | 32 | ||
| @@ -103,10 +102,5 @@ void native_machine_crash_shutdown(struct pt_regs *regs) | |||
| 103 | #ifdef CONFIG_HPET_TIMER | 102 | #ifdef CONFIG_HPET_TIMER |
| 104 | hpet_disable(); | 103 | hpet_disable(); |
| 105 | #endif | 104 | #endif |
| 106 | |||
| 107 | #ifdef CONFIG_X86_64 | ||
| 108 | x86_platform.iommu_shutdown(); | ||
| 109 | #endif | ||
| 110 | |||
| 111 | crash_save_cpu(regs, safe_smp_processor_id()); | 105 | crash_save_cpu(regs, safe_smp_processor_id()); |
| 112 | } | 106 | } |
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c index 68cd24f9deae..0f7f130caa67 100644 --- a/arch/x86/kernel/pci-gart_64.c +++ b/arch/x86/kernel/pci-gart_64.c | |||
| @@ -565,6 +565,9 @@ static void enable_gart_translations(void) | |||
| 565 | 565 | ||
| 566 | enable_gart_translation(dev, __pa(agp_gatt_table)); | 566 | enable_gart_translation(dev, __pa(agp_gatt_table)); |
| 567 | } | 567 | } |
| 568 | |||
| 569 | /* Flush the GART-TLB to remove stale entries */ | ||
| 570 | k8_flush_garts(); | ||
| 568 | } | 571 | } |
| 569 | 572 | ||
| 570 | /* | 573 | /* |
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index ba8b67039d13..01e64270e246 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
| @@ -570,7 +570,7 @@ static ssize_t filter_write(struct file *file, const char __user *userbuf, | |||
| 570 | * Now parse out the first token and use it as the name for the | 570 | * Now parse out the first token and use it as the name for the |
| 571 | * driver to filter for. | 571 | * driver to filter for. |
| 572 | */ | 572 | */ |
| 573 | for (i = 0; i < NAME_MAX_LEN; ++i) { | 573 | for (i = 0; i < NAME_MAX_LEN - 1; ++i) { |
| 574 | current_driver_name[i] = buf[i]; | 574 | current_driver_name[i] = buf[i]; |
| 575 | if (isspace(buf[i]) || buf[i] == ' ' || buf[i] == 0) | 575 | if (isspace(buf[i]) || buf[i] == ' ' || buf[i] == 0) |
| 576 | break; | 576 | break; |
