drm/nv50-nvc0: explicitly map fbcon fb into channel vm
authorBen Skeggs <bskeggs@redhat.com>
Tue, 7 Jun 2011 03:12:44 +0000 (13:12 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 23 Jun 2011 05:59:59 +0000 (15:59 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_fb.h
drivers/gpu/drm/nouveau/nouveau_fbcon.c
drivers/gpu/drm/nouveau/nv50_fbcon.c
drivers/gpu/drm/nouveau/nvc0_fbcon.c

index a3a88ad00f863eb8ba478e0f06e61039e716132d..95c843e684bbaf1aec87607405f9bfc1cbbd842e 100644 (file)
@@ -30,6 +30,7 @@
 struct nouveau_framebuffer {
        struct drm_framebuffer base;
        struct nouveau_bo *nvbo;
+       struct nouveau_vma vma;
        u32 r_dma;
        u32 r_format;
        u32 r_pitch;
index 59ad9600e5557d2d2a92c5dd45f571bc5a0678af..14a8627efe4d0499515d596cbaf665fbfbade690 100644 (file)
@@ -279,6 +279,7 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
        struct fb_info *info;
        struct drm_framebuffer *fb;
        struct nouveau_framebuffer *nouveau_fb;
+       struct nouveau_channel *chan;
        struct nouveau_bo *nvbo;
        struct drm_mode_fb_cmd mode_cmd;
        struct pci_dev *pdev = dev->pdev;
@@ -318,6 +319,15 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
                goto out;
        }
 
+       chan = nouveau_nofbaccel ? NULL : dev_priv->channel;
+       if (chan && dev_priv->card_type >= NV_50) {
+               ret = nouveau_bo_vma_add(nvbo, chan->vm, &nfbdev->nouveau_fb.vma);
+               if (ret) {
+                       NV_ERROR(dev, "failed to map fb into chan: %d\n", ret);
+                       chan = NULL;
+               }
+       }
+
        mutex_lock(&dev->struct_mutex);
 
        info = framebuffer_alloc(0, device);
@@ -448,6 +458,7 @@ nouveau_fbcon_destroy(struct drm_device *dev, struct nouveau_fbdev *nfbdev)
 
        if (nouveau_fb->nvbo) {
                nouveau_bo_unmap(nouveau_fb->nvbo);
+               nouveau_bo_vma_del(nouveau_fb->nvbo, &nouveau_fb->vma);
                drm_gem_object_unreference_unlocked(nouveau_fb->nvbo->gem);
                nouveau_fb->nvbo = NULL;
        }
index 791ded1c5c6d67fe7132eab52550d96e39512e54..dc75a72065242a7dfcc9c7a33dda11fd64e735cb 100644 (file)
@@ -159,7 +159,7 @@ nv50_fbcon_accel_init(struct fb_info *info)
        struct drm_device *dev = nfbdev->dev;
        struct drm_nouveau_private *dev_priv = dev->dev_private;
        struct nouveau_channel *chan = dev_priv->channel;
-       struct nouveau_bo *nvbo = nfbdev->nouveau_fb.nvbo;
+       struct nouveau_framebuffer *fb = &nfbdev->nouveau_fb;
        int ret, format;
 
        switch (info->var.bits_per_pixel) {
@@ -247,8 +247,8 @@ nv50_fbcon_accel_init(struct fb_info *info)
        OUT_RING(chan, info->fix.line_length);
        OUT_RING(chan, info->var.xres_virtual);
        OUT_RING(chan, info->var.yres_virtual);
-       OUT_RING(chan, upper_32_bits(nvbo->vma.offset));
-       OUT_RING(chan, lower_32_bits(nvbo->vma.offset));
+       OUT_RING(chan, upper_32_bits(fb->vma.offset));
+       OUT_RING(chan, lower_32_bits(fb->vma.offset));
        BEGIN_RING(chan, NvSub2D, 0x0230, 2);
        OUT_RING(chan, format);
        OUT_RING(chan, 1);
@@ -256,8 +256,8 @@ nv50_fbcon_accel_init(struct fb_info *info)
        OUT_RING(chan, info->fix.line_length);
        OUT_RING(chan, info->var.xres_virtual);
        OUT_RING(chan, info->var.yres_virtual);
-       OUT_RING(chan, upper_32_bits(nvbo->vma.offset));
-       OUT_RING(chan, lower_32_bits(nvbo->vma.offset));
+       OUT_RING(chan, upper_32_bits(fb->vma.offset));
+       OUT_RING(chan, lower_32_bits(fb->vma.offset));
 
        return 0;
 }
index 4606398858edf0dd8611a3caacbf85e91c76fc4c..5e64a9bcd31817e8eb0feb9b963f2dc387edbec8 100644 (file)
@@ -159,7 +159,7 @@ nvc0_fbcon_accel_init(struct fb_info *info)
        struct drm_device *dev = nfbdev->dev;
        struct drm_nouveau_private *dev_priv = dev->dev_private;
        struct nouveau_channel *chan = dev_priv->channel;
-       struct nouveau_bo *nvbo = nfbdev->nouveau_fb.nvbo;
+       struct nouveau_framebuffer *fb = &nfbdev->nouveau_fb;
        int ret, format;
 
        ret = nouveau_gpuobj_gr_new(chan, 0x902d, 0x902d);
@@ -249,8 +249,8 @@ nvc0_fbcon_accel_init(struct fb_info *info)
        OUT_RING  (chan, info->fix.line_length);
        OUT_RING  (chan, info->var.xres_virtual);
        OUT_RING  (chan, info->var.yres_virtual);
-       OUT_RING  (chan, upper_32_bits(nvbo->vma.offset));
-       OUT_RING  (chan, lower_32_bits(nvbo->vma.offset));
+       OUT_RING  (chan, upper_32_bits(fb->vma.offset));
+       OUT_RING  (chan, lower_32_bits(fb->vma.offset));
        BEGIN_NVC0(chan, 2, NvSub2D, 0x0230, 10);
        OUT_RING  (chan, format);
        OUT_RING  (chan, 1);
@@ -260,8 +260,8 @@ nvc0_fbcon_accel_init(struct fb_info *info)
        OUT_RING  (chan, info->fix.line_length);
        OUT_RING  (chan, info->var.xres_virtual);
        OUT_RING  (chan, info->var.yres_virtual);
-       OUT_RING  (chan, upper_32_bits(nvbo->vma.offset));
-       OUT_RING  (chan, lower_32_bits(nvbo->vma.offset));
+       OUT_RING  (chan, upper_32_bits(fb->vma.offset));
+       OUT_RING  (chan, lower_32_bits(fb->vma.offset));
        FIRE_RING (chan);
 
        return 0;
This page took 0.028695 seconds and 5 git commands to generate.