diff options
| author | Dave Airlie <airlied@redhat.com> | 2011-02-17 13:56:35 +1000 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2011-02-17 13:56:35 +1000 | 
| commit | e138018e3593a6af9ad7680b68c23451587daf11 (patch) | |
| tree | ad1395522de1c3754b0bfe25281139648f2ae032 | |
| parent | 9f4283f49f0a96a64c5a45fe56f0f8c942885eef (diff) | |
| parent | 317495b25ec1f0beb0dbac8ee0dfec59a1addf03 (diff) | |
Merge remote branch 'nouveau/drm-nouveau-next' of /ssd/git/drm-nouveau-next into drm-fixes
* 'nouveau/drm-nouveau-next' of /ssd/git/drm-nouveau-next:
  drm/nouveau: fix suspend/resume on GPUs that don't have PM support
  drm/nouveau: flips/flipd need to always set 'evict' for move_accel_cleanup()
  drm/nv40: fix tiling-related setup for a number of chipsets
  drm/nouveau: fix non-EDIDful native mode selection
  drm/nouveau: Fix detection of DDC-based LVDS on DCB15 boards.
  drm/nv04-nv40: Fix NULL dereference when we fail to find an LVDS native mode.
  drm/nv10: Fix crash when allocating a BO larger than half the available VRAM.
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bios.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_connector.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_pm.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv04_dfp.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv40_graph.c | 46 | 
6 files changed, 40 insertions, 36 deletions
| diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c index 49e5e99917e2..6bdab891c64e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bios.c +++ b/drivers/gpu/drm/nouveau/nouveau_bios.c @@ -6228,7 +6228,7 @@ parse_dcb15_entry(struct drm_device *dev, struct dcb_table *dcb,  		entry->tvconf.has_component_output = false;  		break;  	case OUTPUT_LVDS: -		if ((conn & 0x00003f00) != 0x10) +		if ((conn & 0x00003f00) >> 8 != 0x10)  			entry->lvdsconf.use_straps_for_mode = true;  		entry->lvdsconf.use_power_scripts = true;  		break; diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index a7fae26f4654..d38a4d9f9b0b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c @@ -128,6 +128,7 @@ nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan,  		}  	} +	nvbo->bo.mem.num_pages = size >> PAGE_SHIFT;  	nouveau_bo_placement_set(nvbo, flags, 0);  	nvbo->channel = chan; @@ -166,17 +167,17 @@ static void  set_placement_range(struct nouveau_bo *nvbo, uint32_t type)  {  	struct drm_nouveau_private *dev_priv = nouveau_bdev(nvbo->bo.bdev); +	int vram_pages = dev_priv->vram_size >> PAGE_SHIFT;  	if (dev_priv->card_type == NV_10 && -	    nvbo->tile_mode && (type & TTM_PL_FLAG_VRAM)) { +	    nvbo->tile_mode && (type & TTM_PL_FLAG_VRAM) && +	    nvbo->bo.mem.num_pages < vram_pages / 2) {  		/*  		 * Make sure that the color and depth buffers are handled  		 * by independent memory controller units. Up to a 9x  		 * speed up when alpha-blending and depth-test are enabled  		 * at the same time.  		 */ -		int vram_pages = dev_priv->vram_size >> PAGE_SHIFT; -  		if (nvbo->tile_flags & NOUVEAU_GEM_TILE_ZETA) {  			nvbo->placement.fpfn = vram_pages / 2;  			nvbo->placement.lpfn = ~0; @@ -785,7 +786,7 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr,  	if (ret)  		goto out; -	ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu, new_mem); +	ret = ttm_bo_move_ttm(bo, true, no_wait_reserve, no_wait_gpu, new_mem);  out:  	ttm_bo_mem_put(bo, &tmp_mem);  	return ret; @@ -811,11 +812,11 @@ nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr,  	if (ret)  		return ret; -	ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu, &tmp_mem); +	ret = ttm_bo_move_ttm(bo, true, no_wait_reserve, no_wait_gpu, &tmp_mem);  	if (ret)  		goto out; -	ret = nouveau_bo_move_m2mf(bo, evict, intr, no_wait_reserve, no_wait_gpu, new_mem); +	ret = nouveau_bo_move_m2mf(bo, true, intr, no_wait_reserve, no_wait_gpu, new_mem);  	if (ret)  		goto out; diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c index a21e00076839..390d82c3c4b0 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.c +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c @@ -507,6 +507,7 @@ nouveau_connector_native_mode(struct drm_connector *connector)  	int high_w = 0, high_h = 0, high_v = 0;  	list_for_each_entry(mode, &nv_connector->base.probed_modes, head) { +		mode->vrefresh = drm_mode_vrefresh(mode);  		if (helper->mode_valid(connector, mode) != MODE_OK ||  		    (mode->flags & DRM_MODE_FLAG_INTERLACE))  			continue; diff --git a/drivers/gpu/drm/nouveau/nouveau_pm.c b/drivers/gpu/drm/nouveau/nouveau_pm.c index f05c0cddfeca..4399e2f34db4 100644 --- a/drivers/gpu/drm/nouveau/nouveau_pm.c +++ b/drivers/gpu/drm/nouveau/nouveau_pm.c @@ -543,7 +543,7 @@ nouveau_pm_resume(struct drm_device *dev)  	struct nouveau_pm_engine *pm = &dev_priv->engine.pm;  	struct nouveau_pm_level *perflvl; -	if (pm->cur == &pm->boot) +	if (!pm->cur || pm->cur == &pm->boot)  		return;  	perflvl = pm->cur; diff --git a/drivers/gpu/drm/nouveau/nv04_dfp.c b/drivers/gpu/drm/nouveau/nv04_dfp.c index ef23550407b5..c82db37d9f41 100644 --- a/drivers/gpu/drm/nouveau/nv04_dfp.c +++ b/drivers/gpu/drm/nouveau/nv04_dfp.c @@ -342,8 +342,8 @@ static void nv04_dfp_mode_set(struct drm_encoder *encoder,  	if (nv_encoder->dcb->type == OUTPUT_LVDS) {  		bool duallink, dummy; -		nouveau_bios_parse_lvds_table(dev, nv_connector->native_mode-> -					      clock, &duallink, &dummy); +		nouveau_bios_parse_lvds_table(dev, output_mode->clock, +					      &duallink, &dummy);  		if (duallink)  			regp->fp_control |= (8 << 28);  	} else @@ -518,8 +518,6 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode)  		return;  	if (nv_encoder->dcb->lvdsconf.use_power_scripts) { -		struct nouveau_connector *nv_connector = nouveau_encoder_connector_get(nv_encoder); -  		/* when removing an output, crtc may not be set, but PANEL_OFF  		 * must still be run  		 */ @@ -527,12 +525,8 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode)  			   nv04_dfp_get_bound_head(dev, nv_encoder->dcb);  		if (mode == DRM_MODE_DPMS_ON) { -			if (!nv_connector->native_mode) { -				NV_ERROR(dev, "Not turning on LVDS without native mode\n"); -				return; -			}  			call_lvds_script(dev, nv_encoder->dcb, head, -					 LVDS_PANEL_ON, nv_connector->native_mode->clock); +					 LVDS_PANEL_ON, nv_encoder->mode.clock);  		} else  			/* pxclk of 0 is fine for PANEL_OFF, and for a  			 * disconnected LVDS encoder there is no native_mode diff --git a/drivers/gpu/drm/nouveau/nv40_graph.c b/drivers/gpu/drm/nouveau/nv40_graph.c index 8870d72388c8..18d30c2c1aa6 100644 --- a/drivers/gpu/drm/nouveau/nv40_graph.c +++ b/drivers/gpu/drm/nouveau/nv40_graph.c @@ -211,18 +211,32 @@ nv40_graph_set_tile_region(struct drm_device *dev, int i)  	struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];  	switch (dev_priv->chipset) { +	case 0x40: +	case 0x41: /* guess */ +	case 0x42: +	case 0x43: +	case 0x45: /* guess */ +	case 0x4e: +		nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch); +		nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit); +		nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr); +		nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tile->pitch); +		nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tile->limit); +		nv_wr32(dev, NV40_PGRAPH_TILE1(i), tile->addr); +		break;  	case 0x44:  	case 0x4a: -	case 0x4e:  		nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch);  		nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit);  		nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr);  		break; -  	case 0x46:  	case 0x47:  	case 0x49:  	case 0x4b: +	case 0x4c: +	case 0x67: +	default:  		nv_wr32(dev, NV47_PGRAPH_TSIZE(i), tile->pitch);  		nv_wr32(dev, NV47_PGRAPH_TLIMIT(i), tile->limit);  		nv_wr32(dev, NV47_PGRAPH_TILE(i), tile->addr); @@ -230,15 +244,6 @@ nv40_graph_set_tile_region(struct drm_device *dev, int i)  		nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tile->limit);  		nv_wr32(dev, NV40_PGRAPH_TILE1(i), tile->addr);  		break; - -	default: -		nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch); -		nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit); -		nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr); -		nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tile->pitch); -		nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tile->limit); -		nv_wr32(dev, NV40_PGRAPH_TILE1(i), tile->addr); -		break;  	}  } @@ -396,17 +401,20 @@ nv40_graph_init(struct drm_device *dev)  		break;  	default:  		switch (dev_priv->chipset) { -		case 0x46: -		case 0x47: -		case 0x49: -		case 0x4b: -			nv_wr32(dev, 0x400DF0, nv_rd32(dev, NV04_PFB_CFG0)); -			nv_wr32(dev, 0x400DF4, nv_rd32(dev, NV04_PFB_CFG1)); -			break; -		default: +		case 0x41: +		case 0x42: +		case 0x43: +		case 0x45: +		case 0x4e: +		case 0x44: +		case 0x4a:  			nv_wr32(dev, 0x4009F0, nv_rd32(dev, NV04_PFB_CFG0));  			nv_wr32(dev, 0x4009F4, nv_rd32(dev, NV04_PFB_CFG1));  			break; +		default: +			nv_wr32(dev, 0x400DF0, nv_rd32(dev, NV04_PFB_CFG0)); +			nv_wr32(dev, 0x400DF4, nv_rd32(dev, NV04_PFB_CFG1)); +			break;  		}  		nv_wr32(dev, 0x4069F0, nv_rd32(dev, NV04_PFB_CFG0));  		nv_wr32(dev, 0x4069F4, nv_rd32(dev, NV04_PFB_CFG1)); | 
