From: Ben Skeggs bskeggs@redhat.com
Signed-off-by: Ben Skeggs bskeggs@redhat.com --- drivers/gpu/drm/nouveau/nouveau_object.c | 4 +- drivers/gpu/drm/nouveau/nouveau_state.c | 64 +++++++++++++----------------- 2 files changed, 30 insertions(+), 38 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nouveau_object.c b/drivers/gpu/drm/nouveau/nouveau_object.c index 363379c..4406c175 100644 --- a/drivers/gpu/drm/nouveau/nouveau_object.c +++ b/drivers/gpu/drm/nouveau/nouveau_object.c @@ -793,7 +793,7 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan, return ret;
/* dma objects for display sync channel semaphore blocks */ - for (i = 0; i < 2; i++) { + for (i = 0; i < dev->mode_config.num_crtc; i++) { struct nouveau_gpuobj *sem = NULL; struct nv50_display_crtc *dispc = &nv50_display(dev)->crtc[i]; @@ -878,7 +878,7 @@ nouveau_gpuobj_channel_takedown(struct nouveau_channel *chan) if (dev_priv->card_type >= NV_50) { struct nv50_display *disp = nv50_display(dev);
- for (i = 0; i < 2; i++) { + for (i = 0; i < dev->mode_config.num_crtc; i++) { struct nv50_display_crtc *dispc = &disp->crtc[i]; nouveau_bo_vma_del(dispc->sem.bo, &chan->dispc_vma[i]); } diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index a5619a4..a7df8ea 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c @@ -452,21 +452,6 @@ nouveau_vga_set_decode(void *priv, bool state) return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; }
-static int -nouveau_card_init_channel(struct drm_device *dev) -{ - struct drm_nouveau_private *dev_priv = dev->dev_private; - int ret; - - ret = nouveau_channel_alloc(dev, &dev_priv->channel, NULL, - NvDmaFB, NvDmaTT); - if (ret) - return ret; - - mutex_unlock(&dev_priv->channel->mutex); - return 0; -} - static void nouveau_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state) { @@ -657,6 +642,10 @@ nouveau_card_init(struct drm_device *dev) goto out_engine; }
+ ret = nouveau_irq_init(dev); + if (ret) + goto out_fifo; + /* initialise general modesetting */ drm_mode_config_init(dev); drm_mode_create_scaling_mode_property(dev); @@ -679,39 +668,40 @@ nouveau_card_init(struct drm_device *dev)
ret = engine->display.create(dev); if (ret) - goto out_fifo; - - ret = drm_vblank_init(dev, nv_two_heads(dev) ? 2 : 1); - if (ret) - goto out_vblank; - - ret = nouveau_irq_init(dev); - if (ret) - goto out_vblank; - - /* what about PVIDEO/PCRTC/PRAMDAC etc? */ + goto out_irq;
if (dev_priv->eng[NVOBJ_ENGINE_GR]) { ret = nouveau_fence_init(dev); if (ret) - goto out_irq; + goto out_disp;
- ret = nouveau_card_init_channel(dev); + ret = nouveau_channel_alloc(dev, &dev_priv->channel, NULL, + NvDmaFB, NvDmaTT); if (ret) goto out_fence; + + mutex_unlock(&dev_priv->channel->mutex); + } + + if (dev->mode_config.num_crtc) { + ret = drm_vblank_init(dev, dev->mode_config.num_crtc); + if (ret) + goto out_chan; + + nouveau_fbcon_init(dev); + drm_kms_helper_poll_init(dev); }
- nouveau_fbcon_init(dev); - drm_kms_helper_poll_init(dev); return 0;
+out_chan: + nouveau_channel_put_unlocked(&dev_priv->channel); out_fence: nouveau_fence_fini(dev); +out_disp: + engine->display.destroy(dev); out_irq: nouveau_irq_fini(dev); -out_vblank: - drm_vblank_cleanup(dev); - engine->display.destroy(dev); out_fifo: if (!dev_priv->noaccel) engine->fifo.takedown(dev); @@ -758,8 +748,11 @@ static void nouveau_card_takedown(struct drm_device *dev) struct nouveau_engine *engine = &dev_priv->engine; int e;
- drm_kms_helper_poll_fini(dev); - nouveau_fbcon_fini(dev); + if (dev->mode_config.num_crtc) { + drm_kms_helper_poll_fini(dev); + nouveau_fbcon_fini(dev); + drm_vblank_cleanup(dev); + }
if (dev_priv->channel) { nouveau_channel_put_unlocked(&dev_priv->channel); @@ -801,7 +794,6 @@ static void nouveau_card_takedown(struct drm_device *dev) engine->vram.takedown(dev);
nouveau_irq_fini(dev); - drm_vblank_cleanup(dev);
nouveau_pm_fini(dev); nouveau_bios_takedown(dev);
On Mon, Jul 4, 2011 at 1:15 PM, skeggsb@gmail.com wrote:
From: Ben Skeggs bskeggs@redhat.com
Signed-off-by: Ben Skeggs bskeggs@redhat.com
Please ignore this, was a git-send-email accident :)
drivers/gpu/drm/nouveau/nouveau_object.c | 4 +- drivers/gpu/drm/nouveau/nouveau_state.c | 64 +++++++++++++----------------- 2 files changed, 30 insertions(+), 38 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nouveau_object.c b/drivers/gpu/drm/nouveau/nouveau_object.c index 363379c..4406c175 100644 --- a/drivers/gpu/drm/nouveau/nouveau_object.c +++ b/drivers/gpu/drm/nouveau/nouveau_object.c @@ -793,7 +793,7 @@ nouveau_gpuobj_channel_init(struct nouveau_channel *chan, return ret;
/* dma objects for display sync channel semaphore blocks */
- for (i = 0; i < 2; i++) {
- for (i = 0; i < dev->mode_config.num_crtc; i++) {
struct nouveau_gpuobj *sem = NULL; struct nv50_display_crtc *dispc = &nv50_display(dev)->crtc[i]; @@ -878,7 +878,7 @@ nouveau_gpuobj_channel_takedown(struct nouveau_channel *chan) if (dev_priv->card_type >= NV_50) { struct nv50_display *disp = nv50_display(dev);
- for (i = 0; i < 2; i++) {
- for (i = 0; i < dev->mode_config.num_crtc; i++) {
struct nv50_display_crtc *dispc = &disp->crtc[i]; nouveau_bo_vma_del(dispc->sem.bo, &chan->dispc_vma[i]); } diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index a5619a4..a7df8ea 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c @@ -452,21 +452,6 @@ nouveau_vga_set_decode(void *priv, bool state) return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; }
-static int -nouveau_card_init_channel(struct drm_device *dev) -{
- struct drm_nouveau_private *dev_priv = dev->dev_private;
- int ret;
- ret = nouveau_channel_alloc(dev, &dev_priv->channel, NULL,
- NvDmaFB, NvDmaTT);
- if (ret)
- return ret;
- mutex_unlock(&dev_priv->channel->mutex);
- return 0;
-}
static void nouveau_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state) { @@ -657,6 +642,10 @@ nouveau_card_init(struct drm_device *dev) goto out_engine; }
- ret = nouveau_irq_init(dev);
- if (ret)
- goto out_fifo;
/* initialise general modesetting */ drm_mode_config_init(dev); drm_mode_create_scaling_mode_property(dev); @@ -679,39 +668,40 @@ nouveau_card_init(struct drm_device *dev)
ret = engine->display.create(dev); if (ret)
- goto out_fifo;
- ret = drm_vblank_init(dev, nv_two_heads(dev) ? 2 : 1);
- if (ret)
- goto out_vblank;
- ret = nouveau_irq_init(dev);
- if (ret)
- goto out_vblank;
- /* what about PVIDEO/PCRTC/PRAMDAC etc? */
- goto out_irq;
if (dev_priv->eng[NVOBJ_ENGINE_GR]) { ret = nouveau_fence_init(dev); if (ret)
- goto out_irq;
- goto out_disp;
- ret = nouveau_card_init_channel(dev);
- ret = nouveau_channel_alloc(dev, &dev_priv->channel, NULL,
- NvDmaFB, NvDmaTT);
if (ret) goto out_fence;
- mutex_unlock(&dev_priv->channel->mutex);
- }
- if (dev->mode_config.num_crtc) {
- ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
- if (ret)
- goto out_chan;
- nouveau_fbcon_init(dev);
- drm_kms_helper_poll_init(dev);
}
- nouveau_fbcon_init(dev);
- drm_kms_helper_poll_init(dev);
return 0;
+out_chan:
- nouveau_channel_put_unlocked(&dev_priv->channel);
out_fence: nouveau_fence_fini(dev); +out_disp:
- engine->display.destroy(dev);
out_irq: nouveau_irq_fini(dev); -out_vblank:
- drm_vblank_cleanup(dev);
- engine->display.destroy(dev);
out_fifo: if (!dev_priv->noaccel) engine->fifo.takedown(dev); @@ -758,8 +748,11 @@ static void nouveau_card_takedown(struct drm_device *dev) struct nouveau_engine *engine = &dev_priv->engine; int e;
- drm_kms_helper_poll_fini(dev);
- nouveau_fbcon_fini(dev);
- if (dev->mode_config.num_crtc) {
- drm_kms_helper_poll_fini(dev);
- nouveau_fbcon_fini(dev);
- drm_vblank_cleanup(dev);
- }
if (dev_priv->channel) { nouveau_channel_put_unlocked(&dev_priv->channel); @@ -801,7 +794,6 @@ static void nouveau_card_takedown(struct drm_device *dev) engine->vram.takedown(dev);
nouveau_irq_fini(dev);
- drm_vblank_cleanup(dev);
nouveau_pm_fini(dev); nouveau_bios_takedown(dev); -- 1.7.5.4
dri-devel@lists.freedesktop.org