aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_pci.c')
-rw-r--r--drivers/gpu/drm/drm_pci.c38
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
265static int drm_pci_agp_init(struct drm_device *dev) 265static 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
285static void drm_pci_agp_destroy(struct drm_device *dev) 279void 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
351err_pci: 350err_agp:
351 drm_pci_agp_destroy(dev);
352 pci_disable_device(pdev); 352 pci_disable_device(pdev);
353err_free: 353err_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
455void drm_pci_agp_destroy(struct drm_device *dev) {}
455#endif 456#endif
456 457
457EXPORT_SYMBOL(drm_pci_init); 458EXPORT_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}