Re: [PATCH 1/2] drm/nouveau: fixup init/fini sequence to deal with no CRTCs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jul 4, 2011 at 1:15 PM,  <skeggsb@xxxxxxxxx> wrote:
> From: Ben Skeggs <bskeggs@xxxxxxxxxx>
>
> Signed-off-by: Ben Skeggs <bskeggs@xxxxxxxxxx>

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 mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/dri-devel



[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux