diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-12-10 08:25:48 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-12-10 08:25:48 -0500 |
commit | 9cf7826743e5c78dcfcfdc99d17f79ce6d3a2942 (patch) | |
tree | 24800686a3015846fa598b52049b25ac233cdcba /arch/x86/kernel | |
parent | 3a0340be06a9356eb61f6804107480acbe62c069 (diff) | |
parent | 8638c4914f34fedc1c13b1cc13f6d1e5a78c46b4 (diff) |
Merge branch 'amd-iommu/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu into x86/urgent
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/amd_iommu.c | 46 | ||||
-rw-r--r-- | arch/x86/kernel/amd_iommu_init.c | 9 |
2 files changed, 51 insertions, 4 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 32fb09102a13..a83185080e91 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
@@ -166,6 +166,43 @@ static void iommu_uninit_device(struct device *dev) | |||
166 | { | 166 | { |
167 | kfree(dev->archdata.iommu); | 167 | kfree(dev->archdata.iommu); |
168 | } | 168 | } |
169 | |||
170 | void __init amd_iommu_uninit_devices(void) | ||
171 | { | ||
172 | struct pci_dev *pdev = NULL; | ||
173 | |||
174 | for_each_pci_dev(pdev) { | ||
175 | |||
176 | if (!check_device(&pdev->dev)) | ||
177 | continue; | ||
178 | |||
179 | iommu_uninit_device(&pdev->dev); | ||
180 | } | ||
181 | } | ||
182 | |||
183 | int __init amd_iommu_init_devices(void) | ||
184 | { | ||
185 | struct pci_dev *pdev = NULL; | ||
186 | int ret = 0; | ||
187 | |||
188 | for_each_pci_dev(pdev) { | ||
189 | |||
190 | if (!check_device(&pdev->dev)) | ||
191 | continue; | ||
192 | |||
193 | ret = iommu_init_device(&pdev->dev); | ||
194 | if (ret) | ||
195 | goto out_free; | ||
196 | } | ||
197 | |||
198 | return 0; | ||
199 | |||
200 | out_free: | ||
201 | |||
202 | amd_iommu_uninit_devices(); | ||
203 | |||
204 | return ret; | ||
205 | } | ||
169 | #ifdef CONFIG_AMD_IOMMU_STATS | 206 | #ifdef CONFIG_AMD_IOMMU_STATS |
170 | 207 | ||
171 | /* | 208 | /* |
@@ -1587,6 +1624,11 @@ static struct notifier_block device_nb = { | |||
1587 | .notifier_call = device_change_notifier, | 1624 | .notifier_call = device_change_notifier, |
1588 | }; | 1625 | }; |
1589 | 1626 | ||
1627 | void amd_iommu_init_notifier(void) | ||
1628 | { | ||
1629 | bus_register_notifier(&pci_bus_type, &device_nb); | ||
1630 | } | ||
1631 | |||
1590 | /***************************************************************************** | 1632 | /***************************************************************************** |
1591 | * | 1633 | * |
1592 | * The next functions belong to the dma_ops mapping/unmapping code. | 1634 | * The next functions belong to the dma_ops mapping/unmapping code. |
@@ -2145,8 +2187,6 @@ static void prealloc_protection_domains(void) | |||
2145 | if (!check_device(&dev->dev)) | 2187 | if (!check_device(&dev->dev)) |
2146 | continue; | 2188 | continue; |
2147 | 2189 | ||
2148 | iommu_init_device(&dev->dev); | ||
2149 | |||
2150 | /* Is there already any domain for it? */ | 2190 | /* Is there already any domain for it? */ |
2151 | if (domain_for_device(&dev->dev)) | 2191 | if (domain_for_device(&dev->dev)) |
2152 | continue; | 2192 | continue; |
@@ -2215,8 +2255,6 @@ int __init amd_iommu_init_dma_ops(void) | |||
2215 | 2255 | ||
2216 | register_iommu(&amd_iommu_ops); | 2256 | register_iommu(&amd_iommu_ops); |
2217 | 2257 | ||
2218 | bus_register_notifier(&pci_bus_type, &device_nb); | ||
2219 | |||
2220 | amd_iommu_stats_init(); | 2258 | amd_iommu_stats_init(); |
2221 | 2259 | ||
2222 | return 0; | 2260 | return 0; |
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index 7ffc39965233..309a52f96e0b 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
@@ -1274,6 +1274,10 @@ static int __init amd_iommu_init(void) | |||
1274 | if (ret) | 1274 | if (ret) |
1275 | goto free; | 1275 | goto free; |
1276 | 1276 | ||
1277 | ret = amd_iommu_init_devices(); | ||
1278 | if (ret) | ||
1279 | goto free; | ||
1280 | |||
1277 | if (iommu_pass_through) | 1281 | if (iommu_pass_through) |
1278 | ret = amd_iommu_init_passthrough(); | 1282 | ret = amd_iommu_init_passthrough(); |
1279 | else | 1283 | else |
@@ -1281,6 +1285,8 @@ static int __init amd_iommu_init(void) | |||
1281 | if (ret) | 1285 | if (ret) |
1282 | goto free; | 1286 | goto free; |
1283 | 1287 | ||
1288 | amd_iommu_init_notifier(); | ||
1289 | |||
1284 | enable_iommus(); | 1290 | enable_iommus(); |
1285 | 1291 | ||
1286 | if (iommu_pass_through) | 1292 | if (iommu_pass_through) |
@@ -1296,6 +1302,9 @@ out: | |||
1296 | return ret; | 1302 | return ret; |
1297 | 1303 | ||
1298 | free: | 1304 | free: |
1305 | |||
1306 | amd_iommu_uninit_devices(); | ||
1307 | |||
1299 | free_pages((unsigned long)amd_iommu_pd_alloc_bitmap, | 1308 | free_pages((unsigned long)amd_iommu_pd_alloc_bitmap, |
1300 | get_order(MAX_DOMAIN_ID/8)); | 1309 | get_order(MAX_DOMAIN_ID/8)); |
1301 | 1310 | ||