Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/nv50-nvc0: explicitly map fbcon fb into channel vm

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>

+22 -10
+1
drivers/gpu/drm/nouveau/nouveau_fb.h
··· 30 30 struct nouveau_framebuffer { 31 31 struct drm_framebuffer base; 32 32 struct nouveau_bo *nvbo; 33 + struct nouveau_vma vma; 33 34 u32 r_dma; 34 35 u32 r_format; 35 36 u32 r_pitch;
+11
drivers/gpu/drm/nouveau/nouveau_fbcon.c
··· 279 279 struct fb_info *info; 280 280 struct drm_framebuffer *fb; 281 281 struct nouveau_framebuffer *nouveau_fb; 282 + struct nouveau_channel *chan; 282 283 struct nouveau_bo *nvbo; 283 284 struct drm_mode_fb_cmd mode_cmd; 284 285 struct pci_dev *pdev = dev->pdev; ··· 317 316 nouveau_bo_unpin(nvbo); 318 317 nouveau_bo_ref(NULL, &nvbo); 319 318 goto out; 319 + } 320 + 321 + chan = nouveau_nofbaccel ? NULL : dev_priv->channel; 322 + if (chan && dev_priv->card_type >= NV_50) { 323 + ret = nouveau_bo_vma_add(nvbo, chan->vm, &nfbdev->nouveau_fb.vma); 324 + if (ret) { 325 + NV_ERROR(dev, "failed to map fb into chan: %d\n", ret); 326 + chan = NULL; 327 + } 320 328 } 321 329 322 330 mutex_lock(&dev->struct_mutex); ··· 458 448 459 449 if (nouveau_fb->nvbo) { 460 450 nouveau_bo_unmap(nouveau_fb->nvbo); 451 + nouveau_bo_vma_del(nouveau_fb->nvbo, &nouveau_fb->vma); 461 452 drm_gem_object_unreference_unlocked(nouveau_fb->nvbo->gem); 462 453 nouveau_fb->nvbo = NULL; 463 454 }
+5 -5
drivers/gpu/drm/nouveau/nv50_fbcon.c
··· 159 159 struct drm_device *dev = nfbdev->dev; 160 160 struct drm_nouveau_private *dev_priv = dev->dev_private; 161 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 163 int ret, format; 164 164 165 165 switch (info->var.bits_per_pixel) { ··· 247 247 OUT_RING(chan, info->fix.line_length); 248 248 OUT_RING(chan, info->var.xres_virtual); 249 249 OUT_RING(chan, info->var.yres_virtual); 250 - OUT_RING(chan, upper_32_bits(nvbo->vma.offset)); 251 - OUT_RING(chan, lower_32_bits(nvbo->vma.offset)); 250 + OUT_RING(chan, upper_32_bits(fb->vma.offset)); 251 + OUT_RING(chan, lower_32_bits(fb->vma.offset)); 252 252 BEGIN_RING(chan, NvSub2D, 0x0230, 2); 253 253 OUT_RING(chan, format); 254 254 OUT_RING(chan, 1); ··· 256 256 OUT_RING(chan, info->fix.line_length); 257 257 OUT_RING(chan, info->var.xres_virtual); 258 258 OUT_RING(chan, info->var.yres_virtual); 259 - OUT_RING(chan, upper_32_bits(nvbo->vma.offset)); 260 - OUT_RING(chan, lower_32_bits(nvbo->vma.offset)); 259 + OUT_RING(chan, upper_32_bits(fb->vma.offset)); 260 + OUT_RING(chan, lower_32_bits(fb->vma.offset)); 261 261 262 262 return 0; 263 263 }
+5 -5
drivers/gpu/drm/nouveau/nvc0_fbcon.c
··· 159 159 struct drm_device *dev = nfbdev->dev; 160 160 struct drm_nouveau_private *dev_priv = dev->dev_private; 161 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 163 int ret, format; 164 164 165 165 ret = nouveau_gpuobj_gr_new(chan, 0x902d, 0x902d); ··· 249 249 OUT_RING (chan, info->fix.line_length); 250 250 OUT_RING (chan, info->var.xres_virtual); 251 251 OUT_RING (chan, info->var.yres_virtual); 252 - OUT_RING (chan, upper_32_bits(nvbo->vma.offset)); 253 - OUT_RING (chan, lower_32_bits(nvbo->vma.offset)); 252 + OUT_RING (chan, upper_32_bits(fb->vma.offset)); 253 + OUT_RING (chan, lower_32_bits(fb->vma.offset)); 254 254 BEGIN_NVC0(chan, 2, NvSub2D, 0x0230, 10); 255 255 OUT_RING (chan, format); 256 256 OUT_RING (chan, 1); ··· 260 260 OUT_RING (chan, info->fix.line_length); 261 261 OUT_RING (chan, info->var.xres_virtual); 262 262 OUT_RING (chan, info->var.yres_virtual); 263 - OUT_RING (chan, upper_32_bits(nvbo->vma.offset)); 264 - OUT_RING (chan, lower_32_bits(nvbo->vma.offset)); 263 + OUT_RING (chan, upper_32_bits(fb->vma.offset)); 264 + OUT_RING (chan, lower_32_bits(fb->vma.offset)); 265 265 FIRE_RING (chan); 266 266 267 267 return 0;