diff options
Diffstat (limited to 'drivers/gpu/drm/mgag200')
| -rw-r--r-- | drivers/gpu/drm/mgag200/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/mgag200/mgag200_cursor.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/mgag200/mgag200_drv.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/mgag200/mgag200_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/mgag200/mgag200_fb.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/mgag200/mgag200_main.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/mgag200/mgag200_mode.c | 38 | ||||
| -rw-r--r-- | drivers/gpu/drm/mgag200/mgag200_ttm.c | 11 | 
8 files changed, 43 insertions, 45 deletions
diff --git a/drivers/gpu/drm/mgag200/Kconfig b/drivers/gpu/drm/mgag200/Kconfig index b487cdec5ee..3a1c5fbae54 100644 --- a/drivers/gpu/drm/mgag200/Kconfig +++ b/drivers/gpu/drm/mgag200/Kconfig @@ -5,6 +5,7 @@ config DRM_MGAG200  	select FB_SYS_COPYAREA  	select FB_SYS_IMAGEBLIT  	select DRM_KMS_HELPER +	select DRM_KMS_FB_HELPER  	select DRM_TTM  	help  	 This is a KMS driver for the MGA G200 server chips, it diff --git a/drivers/gpu/drm/mgag200/mgag200_cursor.c b/drivers/gpu/drm/mgag200/mgag200_cursor.c index 801731aeab6..9f9780b7ddf 100644 --- a/drivers/gpu/drm/mgag200/mgag200_cursor.c +++ b/drivers/gpu/drm/mgag200/mgag200_cursor.c @@ -22,8 +22,10 @@ static void mga_hide_cursor(struct mga_device *mdev)  {  	WREG8(MGA_CURPOSXL, 0);  	WREG8(MGA_CURPOSXH, 0); -	mgag200_bo_unpin(mdev->cursor.pixels_1); -	mgag200_bo_unpin(mdev->cursor.pixels_2); +	if (mdev->cursor.pixels_1->pin_count) +		mgag200_bo_unpin(mdev->cursor.pixels_1); +	if (mdev->cursor.pixels_2->pin_count) +		mgag200_bo_unpin(mdev->cursor.pixels_2);  }  int mga_crtc_cursor_set(struct drm_crtc *crtc, @@ -32,7 +34,7 @@ int mga_crtc_cursor_set(struct drm_crtc *crtc,  			uint32_t width,  			uint32_t height)  { -	struct drm_device *dev = (struct drm_device *)file_priv->minor->dev; +	struct drm_device *dev = crtc->dev;  	struct mga_device *mdev = (struct mga_device *)dev->dev_private;  	struct mgag200_bo *pixels_1 = mdev->cursor.pixels_1;  	struct mgag200_bo *pixels_2 = mdev->cursor.pixels_2; diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c b/drivers/gpu/drm/mgag200/mgag200_drv.c index fcce7b2f801..f15ea3c4a90 100644 --- a/drivers/gpu/drm/mgag200/mgag200_drv.c +++ b/drivers/gpu/drm/mgag200/mgag200_drv.c @@ -99,7 +99,6 @@ static struct drm_driver driver = {  	.minor = DRIVER_MINOR,  	.patchlevel = DRIVER_PATCHLEVEL, -	.gem_init_object = mgag200_gem_init_object,  	.gem_free_object = mgag200_gem_free_object,  	.dumb_create = mgag200_dumb_create,  	.dumb_map_offset = mgag200_dumb_mmap_offset, diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h index baaae19332e..cf11ee68a6d 100644 --- a/drivers/gpu/drm/mgag200/mgag200_drv.h +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h @@ -260,7 +260,6 @@ int mgag200_driver_unload(struct drm_device *dev);  int mgag200_gem_create(struct drm_device *dev,  		   u32 size, bool iskernel,  		       struct drm_gem_object **obj); -int mgag200_gem_init_object(struct drm_gem_object *obj);  int mgag200_dumb_create(struct drm_file *file,  			struct drm_device *dev,  			struct drm_mode_create_dumb *args); diff --git a/drivers/gpu/drm/mgag200/mgag200_fb.c b/drivers/gpu/drm/mgag200/mgag200_fb.c index 964f58cee5e..13b7dd83faa 100644 --- a/drivers/gpu/drm/mgag200/mgag200_fb.c +++ b/drivers/gpu/drm/mgag200/mgag200_fb.c @@ -41,7 +41,7 @@ static void mga_dirty_update(struct mga_fbdev *mfbdev,  	 * then the BO is being moved and we should  	 * store up the damage until later.  	 */ -	if (!in_interrupt()) +	if (drm_can_sleep())  		ret = mgag200_bo_reserve(bo, true);  	if (ret) {  		if (ret != -EBUSY) @@ -282,6 +282,11 @@ int mgag200_fbdev_init(struct mga_device *mdev)  {  	struct mga_fbdev *mfbdev;  	int ret; +	int bpp_sel = 32; + +	/* prefer 16bpp on low end gpus with limited VRAM */ +	if (IS_G200_SE(mdev) && mdev->mc.vram_size < (2048*1024)) +		bpp_sel = 16;  	mfbdev = devm_kzalloc(mdev->dev->dev, sizeof(struct mga_fbdev), GFP_KERNEL);  	if (!mfbdev) @@ -301,7 +306,7 @@ int mgag200_fbdev_init(struct mga_device *mdev)  	/* disable all the possible outputs/crtcs before entering KMS mode */  	drm_helper_disable_unused_functions(mdev->dev); -	drm_fb_helper_initial_config(&mfbdev->helper, 32); +	drm_fb_helper_initial_config(&mfbdev->helper, bpp_sel);  	return 0;  } diff --git a/drivers/gpu/drm/mgag200/mgag200_main.c b/drivers/gpu/drm/mgag200/mgag200_main.c index 0f8b861b10b..f6b283b8375 100644 --- a/drivers/gpu/drm/mgag200/mgag200_main.c +++ b/drivers/gpu/drm/mgag200/mgag200_main.c @@ -217,7 +217,10 @@ int mgag200_driver_load(struct drm_device *dev, unsigned long flags)  	drm_mode_config_init(dev);  	dev->mode_config.funcs = (void *)&mga_mode_funcs; -	dev->mode_config.preferred_depth = 24; +	if (IS_G200_SE(mdev) && mdev->mc.vram_size < (2048*1024)) +		dev->mode_config.preferred_depth = 16; +	else +		dev->mode_config.preferred_depth = 24;  	dev->mode_config.prefer_shadow = 1;  	r = mgag200_modeset_init(mdev); @@ -310,13 +313,7 @@ int mgag200_dumb_create(struct drm_file *file,  	return 0;  } -int mgag200_gem_init_object(struct drm_gem_object *obj) -{ -	BUG(); -	return 0; -} - -void mgag200_bo_unref(struct mgag200_bo **bo) +static void mgag200_bo_unref(struct mgag200_bo **bo)  {  	struct ttm_buffer_object *tbo; @@ -325,17 +322,13 @@ void mgag200_bo_unref(struct mgag200_bo **bo)  	tbo = &((*bo)->bo);  	ttm_bo_unref(&tbo); -	if (tbo == NULL) -		*bo = NULL; - +	*bo = NULL;  }  void mgag200_gem_free_object(struct drm_gem_object *obj)  {  	struct mgag200_bo *mgag200_bo = gem_to_mga_bo(obj); -	if (!mgag200_bo) -		return;  	mgag200_bo_unref(&mgag200_bo);  } diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c index 503a414cbda..a034ed40825 100644 --- a/drivers/gpu/drm/mgag200/mgag200_mode.c +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c @@ -29,7 +29,7 @@ static void mga_crtc_load_lut(struct drm_crtc *crtc)  	struct mga_crtc *mga_crtc = to_mga_crtc(crtc);  	struct drm_device *dev = crtc->dev;  	struct mga_device *mdev = dev->dev_private; -	struct drm_framebuffer *fb = crtc->fb; +	struct drm_framebuffer *fb = crtc->primary->fb;  	int i;  	if (!crtc->enabled) @@ -691,7 +691,7 @@ static void mga_g200wb_commit(struct drm_crtc *crtc)     CRTCEXT0 has to be programmed last to trigger an update and make the     new addr variable take effect.   */ -void mga_set_start_address(struct drm_crtc *crtc, unsigned offset) +static void mga_set_start_address(struct drm_crtc *crtc, unsigned offset)  {  	struct mga_device *mdev = crtc->dev->dev_private;  	u32 addr; @@ -742,7 +742,7 @@ static int mga_crtc_do_set_base(struct drm_crtc *crtc,  		mgag200_bo_unreserve(bo);  	} -	mga_fb = to_mga_framebuffer(crtc->fb); +	mga_fb = to_mga_framebuffer(crtc->primary->fb);  	obj = mga_fb->obj;  	bo = gem_to_mga_bo(obj); @@ -765,8 +765,6 @@ static int mga_crtc_do_set_base(struct drm_crtc *crtc,  	}  	mgag200_bo_unreserve(bo); -	DRM_INFO("mga base %llx\n", gpu_addr); -  	mga_set_start_address(crtc, (u32)gpu_addr);  	return 0; @@ -807,7 +805,7 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,  		/* 0x48: */        0,    0,    0,    0,    0,    0,    0,    0  	}; -	bppshift = mdev->bpp_shifts[(crtc->fb->bits_per_pixel >> 3) - 1]; +	bppshift = mdev->bpp_shifts[(crtc->primary->fb->bits_per_pixel >> 3) - 1];  	switch (mdev->type) {  	case G200_SE_A: @@ -845,12 +843,12 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,  		break;  	} -	switch (crtc->fb->bits_per_pixel) { +	switch (crtc->primary->fb->bits_per_pixel) {  	case 8:  		dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_8bits;  		break;  	case 16: -		if (crtc->fb->depth == 15) +		if (crtc->primary->fb->depth == 15)  			dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_15bits;  		else  			dacvalue[MGA1064_MUL_CTL] = MGA1064_MUL_CTL_16bits; @@ -898,8 +896,8 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,  	WREG_SEQ(3, 0);  	WREG_SEQ(4, 0xe); -	pitch = crtc->fb->pitches[0] / (crtc->fb->bits_per_pixel / 8); -	if (crtc->fb->bits_per_pixel == 24) +	pitch = crtc->primary->fb->pitches[0] / (crtc->primary->fb->bits_per_pixel / 8); +	if (crtc->primary->fb->bits_per_pixel == 24)  		pitch = (pitch * 3) >> (4 - bppshift);  	else  		pitch = pitch >> (4 - bppshift); @@ -976,7 +974,7 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,  		((vdisplay & 0xc00) >> 7) |  		((vsyncstart & 0xc00) >> 5) |  		((vdisplay & 0x400) >> 3); -	if (crtc->fb->bits_per_pixel == 24) +	if (crtc->primary->fb->bits_per_pixel == 24)  		ext_vga[3] = (((1 << bppshift) * 3) - 1) | 0x80;  	else  		ext_vga[3] = ((1 << bppshift) - 1) | 0x80; @@ -1036,9 +1034,9 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,  			u32 bpp;  			u32 mb; -			if (crtc->fb->bits_per_pixel > 16) +			if (crtc->primary->fb->bits_per_pixel > 16)  				bpp = 32; -			else if (crtc->fb->bits_per_pixel > 8) +			else if (crtc->primary->fb->bits_per_pixel > 8)  				bpp = 16;  			else  				bpp = 8; @@ -1279,8 +1277,8 @@ static void mga_crtc_disable(struct drm_crtc *crtc)  	int ret;  	DRM_DEBUG_KMS("\n");  	mga_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); -	if (crtc->fb) { -		struct mga_framebuffer *mga_fb = to_mga_framebuffer(crtc->fb); +	if (crtc->primary->fb) { +		struct mga_framebuffer *mga_fb = to_mga_framebuffer(crtc->primary->fb);  		struct drm_gem_object *obj = mga_fb->obj;  		struct mgag200_bo *bo = gem_to_mga_bo(obj);  		ret = mgag200_bo_reserve(bo, false); @@ -1289,7 +1287,7 @@ static void mga_crtc_disable(struct drm_crtc *crtc)  		mgag200_bo_push_sysram(bo);  		mgag200_bo_unreserve(bo);  	} -	crtc->fb = NULL; +	crtc->primary->fb = NULL;  }  /* These provide the minimum set of functions required to handle a CRTC */ @@ -1400,7 +1398,7 @@ static void mga_encoder_commit(struct drm_encoder *encoder)  {  } -void mga_encoder_destroy(struct drm_encoder *encoder) +static void mga_encoder_destroy(struct drm_encoder *encoder)  {  	struct mga_encoder *mga_encoder = to_mga_encoder(encoder);  	drm_encoder_cleanup(encoder); @@ -1521,11 +1519,11 @@ static int mga_vga_mode_valid(struct drm_connector *connector,  		(mga_vga_calculate_mode_bandwidth(mode, bpp)  			> (32700 * 1024))) {  		return MODE_BANDWIDTH; -	} else if (mode->type == G200_EH && +	} else if (mdev->type == G200_EH &&  		(mga_vga_calculate_mode_bandwidth(mode, bpp)  			> (37500 * 1024))) {  		return MODE_BANDWIDTH; -	} else if (mode->type == G200_ER && +	} else if (mdev->type == G200_ER &&  		(mga_vga_calculate_mode_bandwidth(mode,  			bpp) > (55000 * 1024))) {  		return MODE_BANDWIDTH; @@ -1560,7 +1558,7 @@ static int mga_vga_mode_valid(struct drm_connector *connector,  	return MODE_OK;  } -struct drm_encoder *mga_connector_best_encoder(struct drm_connector +static struct drm_encoder *mga_connector_best_encoder(struct drm_connector  						  *connector)  {  	int enc_id = connector->encoder_ids[0]; diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c index 07b192fe15c..5a00e90696d 100644 --- a/drivers/gpu/drm/mgag200/mgag200_ttm.c +++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c @@ -80,7 +80,7 @@ static int mgag200_ttm_global_init(struct mga_device *ast)  	return 0;  } -void +static void  mgag200_ttm_global_release(struct mga_device *ast)  {  	if (ast->ttm.mem_global_ref.release == NULL) @@ -102,7 +102,7 @@ static void mgag200_bo_ttm_destroy(struct ttm_buffer_object *tbo)  	kfree(bo);  } -bool mgag200_ttm_bo_is_mgag200_bo(struct ttm_buffer_object *bo) +static bool mgag200_ttm_bo_is_mgag200_bo(struct ttm_buffer_object *bo)  {  	if (bo->destroy == &mgag200_bo_ttm_destroy)  		return true; @@ -208,7 +208,7 @@ static struct ttm_backend_func mgag200_tt_backend_func = {  }; -struct ttm_tt *mgag200_ttm_tt_create(struct ttm_bo_device *bdev, +static struct ttm_tt *mgag200_ttm_tt_create(struct ttm_bo_device *bdev,  				 unsigned long size, uint32_t page_flags,  				 struct page *dummy_read_page)  { @@ -259,7 +259,9 @@ int mgag200_mm_init(struct mga_device *mdev)  	ret = ttm_bo_device_init(&mdev->ttm.bdev,  				 mdev->ttm.bo_global_ref.ref.object, -				 &mgag200_bo_driver, DRM_FILE_PAGE_OFFSET, +				 &mgag200_bo_driver, +				 dev->anon_inode->i_mapping, +				 DRM_FILE_PAGE_OFFSET,  				 true);  	if (ret) {  		DRM_ERROR("Error initialising bo driver; %d\n", ret); @@ -324,7 +326,6 @@ int mgag200_bo_create(struct drm_device *dev, int size, int align,  	}  	mgabo->bo.bdev = &mdev->ttm.bdev; -	mgabo->bo.bdev->dev_mapping = dev->dev_mapping;  	mgag200_ttm_placement(mgabo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM);  | 
