]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/gpu/drm/nouveau/nv04_fbcon.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / gpu / drm / nouveau / nv04_fbcon.c
index 33e4c9388bc1b8f787f5bc89e7350670098a7722..7a11893710963677c5912fb305fed0a313aae162 100644 (file)
 #include "nouveau_ramht.h"
 #include "nouveau_fbcon.h"
 
-void
+int
 nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region)
 {
        struct nouveau_fbdev *nfbdev = info->par;
        struct drm_device *dev = nfbdev->dev;
        struct drm_nouveau_private *dev_priv = dev->dev_private;
        struct nouveau_channel *chan = dev_priv->channel;
+       int ret;
 
-       if (info->state != FBINFO_STATE_RUNNING)
-               return;
-
-       if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 4)) {
-               nouveau_fbcon_gpu_lockup(info);
-       }
-
-       if (info->flags & FBINFO_HWACCEL_DISABLED) {
-               cfb_copyarea(info, region);
-               return;
-       }
+       ret = RING_SPACE(chan, 4);
+       if (ret)
+               return ret;
 
        BEGIN_RING(chan, NvSubImageBlit, 0x0300, 3);
        OUT_RING(chan, (region->sy << 16) | region->sx);
        OUT_RING(chan, (region->dy << 16) | region->dx);
        OUT_RING(chan, (region->height << 16) | region->width);
        FIRE_RING(chan);
+       return 0;
 }
 
-void
+int
 nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
 {
        struct nouveau_fbdev *nfbdev = info->par;
        struct drm_device *dev = nfbdev->dev;
        struct drm_nouveau_private *dev_priv = dev->dev_private;
        struct nouveau_channel *chan = dev_priv->channel;
+       int ret;
 
-       if (info->state != FBINFO_STATE_RUNNING)
-               return;
-
-       if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 7)) {
-               nouveau_fbcon_gpu_lockup(info);
-       }
-
-       if (info->flags & FBINFO_HWACCEL_DISABLED) {
-               cfb_fillrect(info, rect);
-               return;
-       }
+       ret = RING_SPACE(chan, 7);
+       if (ret)
+               return ret;
 
        BEGIN_RING(chan, NvSubGdiRect, 0x02fc, 1);
        OUT_RING(chan, (rect->rop != ROP_COPY) ? 1 : 3);
@@ -87,9 +74,10 @@ nv04_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
        OUT_RING(chan, (rect->dx << 16) | rect->dy);
        OUT_RING(chan, (rect->width << 16) | rect->height);
        FIRE_RING(chan);
+       return 0;
 }
 
-void
+int
 nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
 {
        struct nouveau_fbdev *nfbdev = info->par;
@@ -101,23 +89,14 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
        uint32_t dsize;
        uint32_t width;
        uint32_t *data = (uint32_t *)image->data;
+       int ret;
 
-       if (info->state != FBINFO_STATE_RUNNING)
-               return;
-
-       if (image->depth != 1) {
-               cfb_imageblit(info, image);
-               return;
-       }
-
-       if (!(info->flags & FBINFO_HWACCEL_DISABLED) && RING_SPACE(chan, 8)) {
-               nouveau_fbcon_gpu_lockup(info);
-       }
+       if (image->depth != 1)
+               return -ENODEV;
 
-       if (info->flags & FBINFO_HWACCEL_DISABLED) {
-               cfb_imageblit(info, image);
-               return;
-       }
+       ret = RING_SPACE(chan, 8);
+       if (ret)
+               return ret;
 
        width = ALIGN(image->width, 8);
        dsize = ALIGN(width * image->height, 32) >> 5;
@@ -144,11 +123,9 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
        while (dsize) {
                int iter_len = dsize > 128 ? 128 : dsize;
 
-               if (RING_SPACE(chan, iter_len + 1)) {
-                       nouveau_fbcon_gpu_lockup(info);
-                       cfb_imageblit(info, image);
-                       return;
-               }
+               ret = RING_SPACE(chan, iter_len + 1);
+               if (ret)
+                       return ret;
 
                BEGIN_RING(chan, NvSubGdiRect, 0x0c00, iter_len);
                OUT_RINGp(chan, data, iter_len);
@@ -157,22 +134,7 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
        }
 
        FIRE_RING(chan);
-}
-
-static int
-nv04_fbcon_grobj_new(struct drm_device *dev, int class, uint32_t handle)
-{
-       struct drm_nouveau_private *dev_priv = dev->dev_private;
-       struct nouveau_gpuobj *obj = NULL;
-       int ret;
-
-       ret = nouveau_gpuobj_gr_new(dev_priv->channel, class, &obj);
-       if (ret)
-               return ret;
-
-       ret = nouveau_ramht_insert(dev_priv->channel, handle, obj);
-       nouveau_gpuobj_ref(NULL, &obj);
-       return ret;
+       return 0;
 }
 
 int
@@ -214,29 +176,31 @@ nv04_fbcon_accel_init(struct fb_info *info)
                return -EINVAL;
        }
 
-       ret = nv04_fbcon_grobj_new(dev, dev_priv->card_type >= NV_10 ?
-                                  0x0062 : 0x0042, NvCtxSurf2D);
+       ret = nouveau_gpuobj_gr_new(chan, NvCtxSurf2D,
+                                   dev_priv->card_type >= NV_10 ?
+                                   0x0062 : 0x0042);
        if (ret)
                return ret;
 
-       ret = nv04_fbcon_grobj_new(dev, 0x0019, NvClipRect);
+       ret = nouveau_gpuobj_gr_new(chan, NvClipRect, 0x0019);
        if (ret)
                return ret;
 
-       ret = nv04_fbcon_grobj_new(dev, 0x0043, NvRop);
+       ret = nouveau_gpuobj_gr_new(chan, NvRop, 0x0043);
        if (ret)
                return ret;
 
-       ret = nv04_fbcon_grobj_new(dev, 0x0044, NvImagePatt);
+       ret = nouveau_gpuobj_gr_new(chan, NvImagePatt, 0x0044);
        if (ret)
                return ret;
 
-       ret = nv04_fbcon_grobj_new(dev, 0x004a, NvGdiRect);
+       ret = nouveau_gpuobj_gr_new(chan, NvGdiRect, 0x004a);
        if (ret)
                return ret;
 
-       ret = nv04_fbcon_grobj_new(dev, dev_priv->chipset >= 0x11 ?
-                                  0x009f : 0x005f, NvImageBlit);
+       ret = nouveau_gpuobj_gr_new(chan, NvImageBlit,
+                                   dev_priv->chipset >= 0x11 ?
+                                   0x009f : 0x005f);
        if (ret)
                return ret;