diff options
Diffstat (limited to 'drivers/gpu/drm/drm_pci.c')
-rw-r--r-- | drivers/gpu/drm/drm_pci.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c index 02679793c9e2..f7af69bcf3f4 100644 --- a/drivers/gpu/drm/drm_pci.c +++ b/drivers/gpu/drm/drm_pci.c | |||
@@ -262,16 +262,11 @@ static int drm_pci_irq_by_busid(struct drm_device *dev, struct drm_irq_busid *p) | |||
262 | return 0; | 262 | return 0; |
263 | } | 263 | } |
264 | 264 | ||
265 | static int drm_pci_agp_init(struct drm_device *dev) | 265 | static void drm_pci_agp_init(struct drm_device *dev) |
266 | { | 266 | { |
267 | if (drm_core_has_AGP(dev)) { | 267 | if (drm_core_check_feature(dev, DRIVER_USE_AGP)) { |
268 | if (drm_pci_device_is_agp(dev)) | 268 | if (drm_pci_device_is_agp(dev)) |
269 | dev->agp = drm_agp_init(dev); | 269 | dev->agp = drm_agp_init(dev); |
270 | if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP) | ||
271 | && (dev->agp == NULL)) { | ||
272 | DRM_ERROR("Cannot initialize the agpgart module.\n"); | ||
273 | return -EINVAL; | ||
274 | } | ||
275 | if (dev->agp) { | 270 | if (dev->agp) { |
276 | dev->agp->agp_mtrr = arch_phys_wc_add( | 271 | dev->agp->agp_mtrr = arch_phys_wc_add( |
277 | dev->agp->agp_info.aper_base, | 272 | dev->agp->agp_info.aper_base, |
@@ -279,15 +274,14 @@ static int drm_pci_agp_init(struct drm_device *dev) | |||
279 | 1024 * 1024); | 274 | 1024 * 1024); |
280 | } | 275 | } |
281 | } | 276 | } |
282 | return 0; | ||
283 | } | 277 | } |
284 | 278 | ||
285 | static void drm_pci_agp_destroy(struct drm_device *dev) | 279 | void drm_pci_agp_destroy(struct drm_device *dev) |
286 | { | 280 | { |
287 | if (drm_core_has_AGP(dev) && dev->agp) { | 281 | if (dev->agp) { |
288 | arch_phys_wc_del(dev->agp->agp_mtrr); | 282 | arch_phys_wc_del(dev->agp->agp_mtrr); |
289 | drm_agp_clear(dev); | 283 | drm_agp_clear(dev); |
290 | drm_agp_destroy(dev->agp); | 284 | kfree(dev->agp); |
291 | dev->agp = NULL; | 285 | dev->agp = NULL; |
292 | } | 286 | } |
293 | } | 287 | } |
@@ -299,8 +293,6 @@ static struct drm_bus drm_pci_bus = { | |||
299 | .set_busid = drm_pci_set_busid, | 293 | .set_busid = drm_pci_set_busid, |
300 | .set_unique = drm_pci_set_unique, | 294 | .set_unique = drm_pci_set_unique, |
301 | .irq_by_busid = drm_pci_irq_by_busid, | 295 | .irq_by_busid = drm_pci_irq_by_busid, |
302 | .agp_init = drm_pci_agp_init, | ||
303 | .agp_destroy = drm_pci_agp_destroy, | ||
304 | }; | 296 | }; |
305 | 297 | ||
306 | /** | 298 | /** |
@@ -338,17 +330,25 @@ int drm_get_pci_dev(struct pci_dev *pdev, const struct pci_device_id *ent, | |||
338 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 330 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
339 | pci_set_drvdata(pdev, dev); | 331 | pci_set_drvdata(pdev, dev); |
340 | 332 | ||
333 | drm_pci_agp_init(dev); | ||
334 | |||
341 | ret = drm_dev_register(dev, ent->driver_data); | 335 | ret = drm_dev_register(dev, ent->driver_data); |
342 | if (ret) | 336 | if (ret) |
343 | goto err_pci; | 337 | goto err_agp; |
344 | 338 | ||
345 | DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n", | 339 | DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n", |
346 | driver->name, driver->major, driver->minor, driver->patchlevel, | 340 | driver->name, driver->major, driver->minor, driver->patchlevel, |
347 | driver->date, pci_name(pdev), dev->primary->index); | 341 | driver->date, pci_name(pdev), dev->primary->index); |
348 | 342 | ||
343 | /* No locking needed since shadow-attach is single-threaded since it may | ||
344 | * only be called from the per-driver module init hook. */ | ||
345 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
346 | list_add_tail(&dev->legacy_dev_list, &driver->legacy_dev_list); | ||
347 | |||
349 | return 0; | 348 | return 0; |
350 | 349 | ||
351 | err_pci: | 350 | err_agp: |
351 | drm_pci_agp_destroy(dev); | ||
352 | pci_disable_device(pdev); | 352 | pci_disable_device(pdev); |
353 | err_free: | 353 | err_free: |
354 | drm_dev_free(dev); | 354 | drm_dev_free(dev); |
@@ -375,7 +375,6 @@ int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver) | |||
375 | 375 | ||
376 | DRM_DEBUG("\n"); | 376 | DRM_DEBUG("\n"); |
377 | 377 | ||
378 | INIT_LIST_HEAD(&driver->device_list); | ||
379 | driver->kdriver.pci = pdriver; | 378 | driver->kdriver.pci = pdriver; |
380 | driver->bus = &drm_pci_bus; | 379 | driver->bus = &drm_pci_bus; |
381 | 380 | ||
@@ -383,6 +382,7 @@ int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver) | |||
383 | return pci_register_driver(pdriver); | 382 | return pci_register_driver(pdriver); |
384 | 383 | ||
385 | /* If not using KMS, fall back to stealth mode manual scanning. */ | 384 | /* If not using KMS, fall back to stealth mode manual scanning. */ |
385 | INIT_LIST_HEAD(&driver->legacy_dev_list); | ||
386 | for (i = 0; pdriver->id_table[i].vendor != 0; i++) { | 386 | for (i = 0; pdriver->id_table[i].vendor != 0; i++) { |
387 | pid = &pdriver->id_table[i]; | 387 | pid = &pdriver->id_table[i]; |
388 | 388 | ||
@@ -452,6 +452,7 @@ int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver) | |||
452 | return -1; | 452 | return -1; |
453 | } | 453 | } |
454 | 454 | ||
455 | void drm_pci_agp_destroy(struct drm_device *dev) {} | ||
455 | #endif | 456 | #endif |
456 | 457 | ||
457 | EXPORT_SYMBOL(drm_pci_init); | 458 | EXPORT_SYMBOL(drm_pci_init); |
@@ -465,8 +466,11 @@ void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver) | |||
465 | if (driver->driver_features & DRIVER_MODESET) { | 466 | if (driver->driver_features & DRIVER_MODESET) { |
466 | pci_unregister_driver(pdriver); | 467 | pci_unregister_driver(pdriver); |
467 | } else { | 468 | } else { |
468 | list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item) | 469 | list_for_each_entry_safe(dev, tmp, &driver->legacy_dev_list, |
470 | legacy_dev_list) { | ||
471 | list_del(&dev->legacy_dev_list); | ||
469 | drm_put_dev(dev); | 472 | drm_put_dev(dev); |
473 | } | ||
470 | } | 474 | } |
471 | DRM_INFO("Module unloaded\n"); | 475 | DRM_INFO("Module unloaded\n"); |
472 | } | 476 | } |