Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 668b6c09 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau: rework the init/takedown ordering



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent f3298532
Loading
Loading
Loading
Loading
+41 −40
Original line number Diff line number Diff line
@@ -592,16 +592,34 @@ nouveau_card_init(struct drm_device *dev)
		nv_mask(dev, 0x00088080, 0x00000800, 0x00000000);
	}

	nouveau_pm_init(dev);
	/* PMC */
	ret = engine->mc.init(dev);
	if (ret)
		goto out_bios;

	/* PTIMER */
	ret = engine->timer.init(dev);
	if (ret)
		goto out_mc;

	/* PFB */
	ret = engine->fb.init(dev);
	if (ret)
		goto out_timer;

	ret = engine->vram.init(dev);
	if (ret)
		goto out_bios;
		goto out_fb;

	ret = nouveau_gpuobj_init(dev);
	/* PGPIO */
	ret = nouveau_gpio_create(dev);
	if (ret)
		goto out_vram;

	ret = nouveau_gpuobj_init(dev);
	if (ret)
		goto out_gpio;

	ret = engine->instmem.init(dev);
	if (ret)
		goto out_gpuobj;
@@ -614,25 +632,7 @@ nouveau_card_init(struct drm_device *dev)
	if (ret)
		goto out_ttmvram;

	/* PMC */
	ret = engine->mc.init(dev);
	if (ret)
		goto out_gart;

	/* PGPIO */
	ret = nouveau_gpio_create(dev);
	if (ret)
		goto out_mc;

	/* PTIMER */
	ret = engine->timer.init(dev);
	if (ret)
		goto out_gpio;

	/* PFB */
	ret = engine->fb.init(dev);
	if (ret)
		goto out_timer;
	nouveau_pm_init(dev);

	if (!dev_priv->noaccel) {
		switch (dev_priv->card_type) {
@@ -783,15 +783,7 @@ nouveau_card_init(struct drm_device *dev)
			dev_priv->eng[e]->destroy(dev,e );
		}
	}

	engine->fb.takedown(dev);
out_timer:
	engine->timer.takedown(dev);
out_gpio:
	nouveau_gpio_destroy(dev);
out_mc:
	engine->mc.takedown(dev);
out_gart:
	nouveau_pm_fini(dev);
	nouveau_mem_gart_fini(dev);
out_ttmvram:
	nouveau_mem_vram_fini(dev);
@@ -799,10 +791,17 @@ nouveau_card_init(struct drm_device *dev)
	engine->instmem.takedown(dev);
out_gpuobj:
	nouveau_gpuobj_takedown(dev);
out_gpio:
	nouveau_gpio_destroy(dev);
out_vram:
	engine->vram.takedown(dev);
out_fb:
	engine->fb.takedown(dev);
out_timer:
	engine->timer.takedown(dev);
out_mc:
	engine->mc.takedown(dev);
out_bios:
	nouveau_pm_fini(dev);
	nouveau_bios_takedown(dev);
out_display_early:
	engine->display.late_takedown(dev);
@@ -839,11 +838,6 @@ static void nouveau_card_takedown(struct drm_device *dev)
			}
		}
	}
	engine->fb.takedown(dev);
	engine->timer.takedown(dev);
	nouveau_gpio_destroy(dev);
	engine->mc.takedown(dev);
	engine->display.late_takedown(dev);

	if (dev_priv->vga_ram) {
		nouveau_bo_unpin(dev_priv->vga_ram);
@@ -859,12 +853,19 @@ static void nouveau_card_takedown(struct drm_device *dev)

	engine->instmem.takedown(dev);
	nouveau_gpuobj_takedown(dev);
	engine->vram.takedown(dev);

	nouveau_irq_fini(dev);

	nouveau_pm_fini(dev);

	nouveau_gpio_destroy(dev);
	engine->vram.takedown(dev);
	engine->fb.takedown(dev);
	engine->timer.takedown(dev);
	engine->mc.takedown(dev);

	nouveau_bios_takedown(dev);
	engine->display.late_takedown(dev);

	nouveau_irq_fini(dev);

	vga_client_register(dev->pdev, NULL, NULL, NULL);
}