diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c | 65 | 
1 files changed, 32 insertions, 33 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c index c1645d21f8e2..96290d9cddca 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c @@ -53,9 +53,9 @@ static struct fb_ops amdgpufb_ops = {  	.owner = THIS_MODULE,  	.fb_check_var = drm_fb_helper_check_var,  	.fb_set_par = drm_fb_helper_set_par, -	.fb_fillrect = cfb_fillrect, -	.fb_copyarea = cfb_copyarea, -	.fb_imageblit = cfb_imageblit, +	.fb_fillrect = drm_fb_helper_cfb_fillrect, +	.fb_copyarea = drm_fb_helper_cfb_copyarea, +	.fb_imageblit = drm_fb_helper_cfb_imageblit,  	.fb_pan_display = drm_fb_helper_pan_display,  	.fb_blank = drm_fb_helper_blank,  	.fb_setcmap = drm_fb_helper_setcmap, @@ -126,8 +126,8 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,  	aligned_size = ALIGN(size, PAGE_SIZE);  	ret = amdgpu_gem_object_create(adev, aligned_size, 0,  				       AMDGPU_GEM_DOMAIN_VRAM, -				       0, true, -				       &gobj); +				       AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, +				       true, &gobj);  	if (ret) {  		printk(KERN_ERR "failed to allocate framebuffer (%d)\n",  		       aligned_size); @@ -179,7 +179,6 @@ static int amdgpufb_create(struct drm_fb_helper *helper,  	struct drm_mode_fb_cmd2 mode_cmd;  	struct drm_gem_object *gobj = NULL;  	struct amdgpu_bo *rbo = NULL; -	struct device *device = &adev->pdev->dev;  	int ret;  	unsigned long tmp; @@ -201,9 +200,9 @@ static int amdgpufb_create(struct drm_fb_helper *helper,  	rbo = gem_to_amdgpu_bo(gobj);  	/* okay we have an object now allocate the framebuffer */ -	info = framebuffer_alloc(0, device); -	if (info == NULL) { -		ret = -ENOMEM; +	info = drm_fb_helper_alloc_fbi(helper); +	if (IS_ERR(info)) { +		ret = PTR_ERR(info);  		goto out_unref;  	} @@ -212,14 +211,13 @@ static int amdgpufb_create(struct drm_fb_helper *helper,  	ret = amdgpu_framebuffer_init(adev->ddev, &rfbdev->rfb, &mode_cmd, gobj);  	if (ret) {  		DRM_ERROR("failed to initialize framebuffer %d\n", ret); -		goto out_unref; +		goto out_destroy_fbi;  	}  	fb = &rfbdev->rfb.base;  	/* setup helper */  	rfbdev->helper.fb = fb; -	rfbdev->helper.fbdev = info;  	memset_io(rbo->kptr, 0x0, amdgpu_bo_size(rbo)); @@ -239,11 +237,6 @@ static int amdgpufb_create(struct drm_fb_helper *helper,  	drm_fb_helper_fill_var(info, &rfbdev->helper, sizes->fb_width, sizes->fb_height);  	/* setup aperture base/size for vesafb takeover */ -	info->apertures = alloc_apertures(1); -	if (!info->apertures) { -		ret = -ENOMEM; -		goto out_unref; -	}  	info->apertures->ranges[0].base = adev->ddev->mode_config.fb_base;  	info->apertures->ranges[0].size = adev->mc.aper_size; @@ -251,13 +244,7 @@ static int amdgpufb_create(struct drm_fb_helper *helper,  	if (info->screen_base == NULL) {  		ret = -ENOSPC; -		goto out_unref; -	} - -	ret = fb_alloc_cmap(&info->cmap, 256, 0); -	if (ret) { -		ret = -ENOMEM; -		goto out_unref; +		goto out_destroy_fbi;  	}  	DRM_INFO("fb mappable at 0x%lX\n",  info->fix.smem_start); @@ -269,6 +256,8 @@ static int amdgpufb_create(struct drm_fb_helper *helper,  	vga_switcheroo_client_fb_set(adev->ddev->pdev, info);  	return 0; +out_destroy_fbi: +	drm_fb_helper_release_fbi(helper);  out_unref:  	if (rbo) { @@ -290,17 +279,10 @@ void amdgpu_fb_output_poll_changed(struct amdgpu_device *adev)  static int amdgpu_fbdev_destroy(struct drm_device *dev, struct amdgpu_fbdev *rfbdev)  { -	struct fb_info *info;  	struct amdgpu_framebuffer *rfb = &rfbdev->rfb; -	if (rfbdev->helper.fbdev) { -		info = rfbdev->helper.fbdev; - -		unregister_framebuffer(info); -		if (info->cmap.len) -			fb_dealloc_cmap(&info->cmap); -		framebuffer_release(info); -	} +	drm_fb_helper_unregister_fbi(&rfbdev->helper); +	drm_fb_helper_release_fbi(&rfbdev->helper);  	if (rfb->obj) {  		amdgpufb_destroy_pinned_object(rfb->obj); @@ -395,7 +377,8 @@ void amdgpu_fbdev_fini(struct amdgpu_device *adev)  void amdgpu_fbdev_set_suspend(struct amdgpu_device *adev, int state)  {  	if (adev->mode_info.rfbdev) -		fb_set_suspend(adev->mode_info.rfbdev->helper.fbdev, state); +		drm_fb_helper_set_suspend(&adev->mode_info.rfbdev->helper, +			state);  }  int amdgpu_fbdev_total_size(struct amdgpu_device *adev) @@ -419,3 +402,19 @@ bool amdgpu_fbdev_robj_is_fb(struct amdgpu_device *adev, struct amdgpu_bo *robj)  		return true;  	return false;  } + +void amdgpu_fbdev_restore_mode(struct amdgpu_device *adev) +{ +	struct amdgpu_fbdev *afbdev = adev->mode_info.rfbdev; +	struct drm_fb_helper *fb_helper; +	int ret; + +	if (!afbdev) +		return; + +	fb_helper = &afbdev->helper; + +	ret = drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); +	if (ret) +		DRM_DEBUG("failed to restore crtc mode\n"); +} | 
