diff options
Diffstat (limited to 'drivers/gpu/drm/ast/ast_main.c')
| -rw-r--r-- | drivers/gpu/drm/ast/ast_main.c | 54 | 
1 files changed, 29 insertions, 25 deletions
| diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c index 21715d6a9b56..b79f484e9bd2 100644 --- a/drivers/gpu/drm/ast/ast_main.c +++ b/drivers/gpu/drm/ast/ast_main.c @@ -28,6 +28,7 @@  #include <linux/pci.h> +#include <drm/drm_atomic_helper.h>  #include <drm/drm_crtc_helper.h>  #include <drm/drm_fb_helper.h>  #include <drm/drm_gem.h> @@ -387,8 +388,33 @@ static int ast_get_dram_info(struct drm_device *dev)  	return 0;  } +enum drm_mode_status ast_mode_config_mode_valid(struct drm_device *dev, +						const struct drm_display_mode *mode) +{ +	static const unsigned long max_bpp = 4; /* DRM_FORMAT_XRGBA8888 */ + +	struct ast_private *ast = dev->dev_private; +	unsigned long fbsize, fbpages, max_fbpages; + +	/* To support double buffering, a framebuffer may not +	 * consume more than half of the available VRAM. +	 */ +	max_fbpages = (ast->vram_size / 2) >> PAGE_SHIFT; + +	fbsize = mode->hdisplay * mode->vdisplay * max_bpp; +	fbpages = DIV_ROUND_UP(fbsize, PAGE_SIZE); + +	if (fbpages > max_fbpages) +		return MODE_MEM; + +	return MODE_OK; +} +  static const struct drm_mode_config_funcs ast_mode_funcs = { -	.fb_create = drm_gem_fb_create +	.fb_create = drm_gem_fb_create, +	.mode_valid = ast_mode_config_mode_valid, +	.atomic_check = drm_atomic_helper_check, +	.atomic_commit = drm_atomic_helper_commit,  };  static u32 ast_get_vram_info(struct drm_device *dev) @@ -506,6 +532,8 @@ int ast_driver_load(struct drm_device *dev, unsigned long flags)  	if (ret)  		goto out_free; +	drm_mode_config_reset(dev); +  	ret = drm_fbdev_generic_setup(dev, 32);  	if (ret)  		goto out_free; @@ -535,27 +563,3 @@ void ast_driver_unload(struct drm_device *dev)  	pci_iounmap(dev->pdev, ast->regs);  	kfree(ast);  } - -int ast_gem_create(struct drm_device *dev, -		   u32 size, bool iskernel, -		   struct drm_gem_object **obj) -{ -	struct drm_gem_vram_object *gbo; -	int ret; - -	*obj = NULL; - -	size = roundup(size, PAGE_SIZE); -	if (size == 0) -		return -EINVAL; - -	gbo = drm_gem_vram_create(dev, &dev->vram_mm->bdev, size, 0, false); -	if (IS_ERR(gbo)) { -		ret = PTR_ERR(gbo); -		if (ret != -ERESTARTSYS) -			DRM_ERROR("failed to allocate GEM object\n"); -		return ret; -	} -	*obj = &gbo->bo.base; -	return 0; -} |