diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2011-06-06 23:12:44 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2011-06-23 01:59:59 -0400 |
commit | 45143cb53c793b11b875d555eb96ca32bcbea1c7 (patch) | |
tree | 95661f814066f21c080b7ae5da5711c66d898d98 | |
parent | fd2871af3d2dad4e07df84941128b0813b5dd34b (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.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_fbcon.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nv50_fbcon.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvc0_fbcon.c | 10 |
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 @@ | |||
30 | struct nouveau_framebuffer { | 30 | struct 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; |