* Re: [PATCH 1/2] drm/nouveau: fixup init/fini sequence to deal with no CRTCs
2011-07-04 3:15 [PATCH 1/2] drm/nouveau: fixup init/fini sequence to deal with no CRTCs skeggsb
@ 2011-07-04 3:14 ` Ben Skeggs
0 siblings, 0 replies; 2+ messages in thread
From: Ben Skeggs @ 2011-07-04 3:14 UTC (permalink / raw)
To: dri-devel; +Cc: Ben Skeggs
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
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH 1/2] drm/nouveau: fixup init/fini sequence to deal with no CRTCs
@ 2011-07-04 3:15 skeggsb
2011-07-04 3:14 ` Ben Skeggs
0 siblings, 1 reply; 2+ messages in thread
From: skeggsb @ 2011-07-04 3:15 UTC (permalink / raw)
To: dri-devel; +Cc: Ben Skeggs
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);
--
1.7.5.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-07-04 3:14 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-04 3:15 [PATCH 1/2] drm/nouveau: fixup init/fini sequence to deal with no CRTCs skeggsb
2011-07-04 3:14 ` Ben Skeggs
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.