Merge branch 'drm-ttm-unmappable' into drm-core-next
[pandora-kernel.git] / drivers / gpu / drm / nouveau / nouveau_state.c
index 10656a6..92100a9 100644 (file)
@@ -34,6 +34,7 @@
 
 #include "nouveau_drv.h"
 #include "nouveau_drm.h"
+#include "nouveau_fbcon.h"
 #include "nv50_display.h"
 
 static void nouveau_stub_takedown(struct drm_device *dev) {}
@@ -341,7 +342,7 @@ nouveau_card_init_channel(struct drm_device *dev)
 
        gpuobj = NULL;
        ret = nouveau_gpuobj_dma_new(dev_priv->channel, NV_CLASS_DMA_IN_MEMORY,
-                                    0, nouveau_mem_fb_amount(dev),
+                                    0, dev_priv->vram_size,
                                     NV_DMA_ACCESS_RW, NV_DMA_TARGET_VIDMEM,
                                     &gpuobj);
        if (ret)
@@ -427,6 +428,10 @@ nouveau_card_init(struct drm_device *dev)
                        goto out;
        }
 
+       ret = nouveau_mem_detect(dev);
+       if (ret)
+               goto out_bios;
+
        ret = nouveau_gpuobj_early_init(dev);
        if (ret)
                goto out_bios;
@@ -502,7 +507,7 @@ nouveau_card_init(struct drm_device *dev)
                else
                        ret = nv04_display_create(dev);
                if (ret)
-                       goto out_irq;
+                       goto out_channel;
        }
 
        ret = nouveau_backlight_init(dev);
@@ -512,10 +517,15 @@ nouveau_card_init(struct drm_device *dev)
        dev_priv->init_state = NOUVEAU_CARD_INIT_DONE;
 
        if (drm_core_check_feature(dev, DRIVER_MODESET))
-               drm_helper_initial_config(dev);
+               nouveau_fbcon_init(dev);
 
        return 0;
 
+out_channel:
+       if (dev_priv->channel) {
+               nouveau_channel_free(dev_priv->channel);
+               dev_priv->channel = NULL;
+       }
 out_irq:
        drm_irq_uninstall(dev);
 out_fifo:
@@ -533,6 +543,7 @@ out_mc:
 out_gpuobj:
        nouveau_gpuobj_takedown(dev);
 out_mem:
+       nouveau_sgdma_takedown(dev);
        nouveau_mem_close(dev);
 out_instmem:
        engine->instmem.takedown(dev);
@@ -553,6 +564,7 @@ static void nouveau_card_takedown(struct drm_device *dev)
        NV_DEBUG(dev, "prev state = %d\n", dev_priv->init_state);
 
        if (dev_priv->init_state != NOUVEAU_CARD_INIT_DOWN) {
+
                nouveau_backlight_exit(dev);
 
                if (dev_priv->channel) {
@@ -784,6 +796,7 @@ int nouveau_unload(struct drm_device *dev)
        struct drm_nouveau_private *dev_priv = dev->dev_private;
 
        if (drm_core_check_feature(dev, DRIVER_MODESET)) {
+               nouveau_fbcon_fini(dev);
                if (dev_priv->card_type >= NV_50)
                        nv50_display_destroy(dev);
                else