aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2010-07-08 20:56:08 -0400
committerBen Skeggs <bskeggs@redhat.com>2010-07-12 20:13:56 -0400
commite88efe056d308d0a3b6b645d0eec7236b2d8c902 (patch)
tree6b68d5cf5f349ebbeedbc3ecfd863a6e1afd9a3e
parent271f29e7b55278bc2e4bab53448eef9b35778664 (diff)
drm/nouveau: initialise display before enabling interrupts
In some situations it's possible we can receive a spurious hotplug IRQ before we're ready to handle it, leading to an oops. Calling the display init before enabling interrupts should clear any pending IRQs on the GPU and prevent this from happening. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_state.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
index 67ee32fbba9d..c58ff9c48603 100644
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
+++ b/drivers/gpu/drm/nouveau/nouveau_state.c
@@ -471,12 +471,19 @@ nouveau_card_init(struct drm_device *dev)
471 goto out_graph; 471 goto out_graph;
472 } 472 }
473 473
474 if (dev_priv->card_type >= NV_50)
475 ret = nv50_display_create(dev);
476 else
477 ret = nv04_display_create(dev);
478 if (ret)
479 goto out_fifo;
480
474 /* this call irq_preinstall, register irq handler and 481 /* this call irq_preinstall, register irq handler and
475 * call irq_postinstall 482 * call irq_postinstall
476 */ 483 */
477 ret = drm_irq_install(dev); 484 ret = drm_irq_install(dev);
478 if (ret) 485 if (ret)
479 goto out_fifo; 486 goto out_display;
480 487
481 ret = drm_vblank_init(dev, 0); 488 ret = drm_vblank_init(dev, 0);
482 if (ret) 489 if (ret)
@@ -490,13 +497,6 @@ nouveau_card_init(struct drm_device *dev)
490 goto out_irq; 497 goto out_irq;
491 } 498 }
492 499
493 if (dev_priv->card_type >= NV_50)
494 ret = nv50_display_create(dev);
495 else
496 ret = nv04_display_create(dev);
497 if (ret)
498 goto out_channel;
499
500 ret = nouveau_backlight_init(dev); 500 ret = nouveau_backlight_init(dev);
501 if (ret) 501 if (ret)
502 NV_ERROR(dev, "Error %d registering backlight\n", ret); 502 NV_ERROR(dev, "Error %d registering backlight\n", ret);
@@ -505,13 +505,13 @@ nouveau_card_init(struct drm_device *dev)
505 drm_kms_helper_poll_init(dev); 505 drm_kms_helper_poll_init(dev);
506 return 0; 506 return 0;
507 507
508out_channel:
509 if (dev_priv->channel) {
510 nouveau_channel_free(dev_priv->channel);
511 dev_priv->channel = NULL;
512 }
513out_irq: 508out_irq:
514 drm_irq_uninstall(dev); 509 drm_irq_uninstall(dev);
510out_display:
511 if (dev_priv->card_type >= NV_50)
512 nv50_display_destroy(dev);
513 else
514 nv04_display_destroy(dev);
515out_fifo: 515out_fifo:
516 if (!nouveau_noaccel) 516 if (!nouveau_noaccel)
517 engine->fifo.takedown(dev); 517 engine->fifo.takedown(dev);