aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2011-06-06 23:12:44 -0400
committerBen Skeggs <bskeggs@redhat.com>2011-06-23 01:59:59 -0400
commit45143cb53c793b11b875d555eb96ca32bcbea1c7 (patch)
tree95661f814066f21c080b7ae5da5711c66d898d98
parentfd2871af3d2dad4e07df84941128b0813b5dd34b (diff)
drm/nv50-nvc0: explicitly map fbcon fb into channel vm
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fb.h1
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fbcon.c11
-rw-r--r--drivers/gpu/drm/nouveau/nv50_fbcon.c10
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_fbcon.c10
4 files changed, 22 insertions, 10 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_fb.h b/drivers/gpu/drm/nouveau/nouveau_fb.h
index a3a88ad00f86..95c843e684bb 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fb.h
+++ b/drivers/gpu/drm/nouveau/nouveau_fb.h
@@ -30,6 +30,7 @@
30struct nouveau_framebuffer { 30struct nouveau_framebuffer {
31 struct drm_framebuffer base; 31 struct drm_framebuffer base;
32 struct nouveau_bo *nvbo; 32 struct nouveau_bo *nvbo;
33 struct nouveau_vma vma;
33 u32 r_dma; 34 u32 r_dma;
34 u32 r_format; 35 u32 r_format;
35 u32 r_pitch; 36 u32 r_pitch;
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
index 59ad9600e555..14a8627efe4d 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
@@ -279,6 +279,7 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
279 struct fb_info *info; 279 struct fb_info *info;
280 struct drm_framebuffer *fb; 280 struct drm_framebuffer *fb;
281 struct nouveau_framebuffer *nouveau_fb; 281 struct nouveau_framebuffer *nouveau_fb;
282 struct nouveau_channel *chan;
282 struct nouveau_bo *nvbo; 283 struct nouveau_bo *nvbo;
283 struct drm_mode_fb_cmd mode_cmd; 284 struct drm_mode_fb_cmd mode_cmd;
284 struct pci_dev *pdev = dev->pdev; 285 struct pci_dev *pdev = dev->pdev;
@@ -318,6 +319,15 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
318 goto out; 319 goto out;
319 } 320 }
320 321
322 chan = nouveau_nofbaccel ? NULL : dev_priv->channel;
323 if (chan && dev_priv->card_type >= NV_50) {
324 ret = nouveau_bo_vma_add(nvbo, chan->vm, &nfbdev->nouveau_fb.vma);
325 if (ret) {
326 NV_ERROR(dev, "failed to map fb into chan: %d\n", ret);
327 chan = NULL;
328 }
329 }
330
321 mutex_lock(&dev->struct_mutex); 331 mutex_lock(&dev->struct_mutex);
322 332
323 info = framebuffer_alloc(0, device); 333 info = framebuffer_alloc(0, device);
@@ -448,6 +458,7 @@ nouveau_fbcon_destroy(struct drm_device *dev, struct nouveau_fbdev *nfbdev)
448 458
449 if (nouveau_fb->nvbo) { 459 if (nouveau_fb->nvbo) {
450 nouveau_bo_unmap(nouveau_fb->nvbo); 460 nouveau_bo_unmap(nouveau_fb->nvbo);
461 nouveau_bo_vma_del(nouveau_fb->nvbo, &nouveau_fb->vma);
451 drm_gem_object_unreference_unlocked(nouveau_fb->nvbo->gem); 462 drm_gem_object_unreference_unlocked(nouveau_fb->nvbo->gem);
452 nouveau_fb->nvbo = NULL; 463 nouveau_fb->nvbo = NULL;
453 } 464 }
diff --git a/drivers/gpu/drm/nouveau/nv50_fbcon.c b/drivers/gpu/drm/nouveau/nv50_fbcon.c
index 791ded1c5c6d..dc75a7206524 100644
--- a/drivers/gpu/drm/nouveau/nv50_fbcon.c
+++ b/drivers/gpu/drm/nouveau/nv50_fbcon.c
@@ -159,7 +159,7 @@ nv50_fbcon_accel_init(struct fb_info *info)
159 struct drm_device *dev = nfbdev->dev; 159 struct drm_device *dev = nfbdev->dev;
160 struct drm_nouveau_private *dev_priv = dev->dev_private; 160 struct drm_nouveau_private *dev_priv = dev->dev_private;
161 struct nouveau_channel *chan = dev_priv->channel; 161 struct nouveau_channel *chan = dev_priv->channel;
162 struct nouveau_bo *nvbo = nfbdev->nouveau_fb.nvbo; 162 struct nouveau_framebuffer *fb = &nfbdev->nouveau_fb;
163 int ret, format; 163 int ret, format;
164 164
165 switch (info->var.bits_per_pixel) { 165 switch (info->var.bits_per_pixel) {
@@ -247,8 +247,8 @@ nv50_fbcon_accel_init(struct fb_info *info)
247 OUT_RING(chan, info->fix.line_length); 247 OUT_RING(chan, info->fix.line_length);
248 OUT_RING(chan, info->var.xres_virtual); 248 OUT_RING(chan, info->var.xres_virtual);
249 OUT_RING(chan, info->var.yres_virtual); 249 OUT_RING(chan, info->var.yres_virtual);
250 OUT_RING(chan, upper_32_bits(nvbo->vma.offset)); 250 OUT_RING(chan, upper_32_bits(fb->vma.offset));
251 OUT_RING(chan, lower_32_bits(nvbo->vma.offset)); 251 OUT_RING(chan, lower_32_bits(fb->vma.offset));
252 BEGIN_RING(chan, NvSub2D, 0x0230, 2); 252 BEGIN_RING(chan, NvSub2D, 0x0230, 2);
253 OUT_RING(chan, format); 253 OUT_RING(chan, format);
254 OUT_RING(chan, 1); 254 OUT_RING(chan, 1);
@@ -256,8 +256,8 @@ nv50_fbcon_accel_init(struct fb_info *info)
256 OUT_RING(chan, info->fix.line_length); 256 OUT_RING(chan, info->fix.line_length);
257 OUT_RING(chan, info->var.xres_virtual); 257 OUT_RING(chan, info->var.xres_virtual);
258 OUT_RING(chan, info->var.yres_virtual); 258 OUT_RING(chan, info->var.yres_virtual);
259 OUT_RING(chan, upper_32_bits(nvbo->vma.offset)); 259 OUT_RING(chan, upper_32_bits(fb->vma.offset));
260 OUT_RING(chan, lower_32_bits(nvbo->vma.offset)); 260 OUT_RING(chan, lower_32_bits(fb->vma.offset));
261 261
262 return 0; 262 return 0;
263} 263}
diff --git a/drivers/gpu/drm/nouveau/nvc0_fbcon.c b/drivers/gpu/drm/nouveau/nvc0_fbcon.c
index 4606398858ed..5e64a9bcd318 100644
--- a/drivers/gpu/drm/nouveau/nvc0_fbcon.c
+++ b/drivers/gpu/drm/nouveau/nvc0_fbcon.c
@@ -159,7 +159,7 @@ nvc0_fbcon_accel_init(struct fb_info *info)
159 struct drm_device *dev = nfbdev->dev; 159 struct drm_device *dev = nfbdev->dev;
160 struct drm_nouveau_private *dev_priv = dev->dev_private; 160 struct drm_nouveau_private *dev_priv = dev->dev_private;
161 struct nouveau_channel *chan = dev_priv->channel; 161 struct nouveau_channel *chan = dev_priv->channel;
162 struct nouveau_bo *nvbo = nfbdev->nouveau_fb.nvbo; 162 struct nouveau_framebuffer *fb = &nfbdev->nouveau_fb;
163 int ret, format; 163 int ret, format;
164 164
165 ret = nouveau_gpuobj_gr_new(chan, 0x902d, 0x902d); 165 ret = nouveau_gpuobj_gr_new(chan, 0x902d, 0x902d);
@@ -249,8 +249,8 @@ nvc0_fbcon_accel_init(struct fb_info *info)
249 OUT_RING (chan, info->fix.line_length); 249 OUT_RING (chan, info->fix.line_length);
250 OUT_RING (chan, info->var.xres_virtual); 250 OUT_RING (chan, info->var.xres_virtual);
251 OUT_RING (chan, info->var.yres_virtual); 251 OUT_RING (chan, info->var.yres_virtual);
252 OUT_RING (chan, upper_32_bits(nvbo->vma.offset)); 252 OUT_RING (chan, upper_32_bits(fb->vma.offset));
253 OUT_RING (chan, lower_32_bits(nvbo->vma.offset)); 253 OUT_RING (chan, lower_32_bits(fb->vma.offset));
254 BEGIN_NVC0(chan, 2, NvSub2D, 0x0230, 10); 254 BEGIN_NVC0(chan, 2, NvSub2D, 0x0230, 10);
255 OUT_RING (chan, format); 255 OUT_RING (chan, format);
256 OUT_RING (chan, 1); 256 OUT_RING (chan, 1);
@@ -260,8 +260,8 @@ nvc0_fbcon_accel_init(struct fb_info *info)
260 OUT_RING (chan, info->fix.line_length); 260 OUT_RING (chan, info->fix.line_length);
261 OUT_RING (chan, info->var.xres_virtual); 261 OUT_RING (chan, info->var.xres_virtual);
262 OUT_RING (chan, info->var.yres_virtual); 262 OUT_RING (chan, info->var.yres_virtual);
263 OUT_RING (chan, upper_32_bits(nvbo->vma.offset)); 263 OUT_RING (chan, upper_32_bits(fb->vma.offset));
264 OUT_RING (chan, lower_32_bits(nvbo->vma.offset)); 264 OUT_RING (chan, lower_32_bits(fb->vma.offset));
265 FIRE_RING (chan); 265 FIRE_RING (chan);
266 266
267 return 0; 267 return 0;