提交 c8b392e9 编写于 作者: L Linus Torvalds

Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6

* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6:
  drm/radeon/kms: add missing frac fb div flag for dce4+
  drm/radeon/kms: do not reject X16 and Y16X16 floating-point formats on r300
  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.
...@@ -6228,7 +6228,7 @@ parse_dcb15_entry(struct drm_device *dev, struct dcb_table *dcb, ...@@ -6228,7 +6228,7 @@ parse_dcb15_entry(struct drm_device *dev, struct dcb_table *dcb,
entry->tvconf.has_component_output = false; entry->tvconf.has_component_output = false;
break; break;
case OUTPUT_LVDS: case OUTPUT_LVDS:
if ((conn & 0x00003f00) != 0x10) if ((conn & 0x00003f00) >> 8 != 0x10)
entry->lvdsconf.use_straps_for_mode = true; entry->lvdsconf.use_straps_for_mode = true;
entry->lvdsconf.use_power_scripts = true; entry->lvdsconf.use_power_scripts = true;
break; break;
......
...@@ -128,6 +128,7 @@ nouveau_bo_new(struct drm_device *dev, struct nouveau_channel *chan, ...@@ -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); nouveau_bo_placement_set(nvbo, flags, 0);
nvbo->channel = chan; nvbo->channel = chan;
...@@ -166,17 +167,17 @@ static void ...@@ -166,17 +167,17 @@ static void
set_placement_range(struct nouveau_bo *nvbo, uint32_t type) set_placement_range(struct nouveau_bo *nvbo, uint32_t type)
{ {
struct drm_nouveau_private *dev_priv = nouveau_bdev(nvbo->bo.bdev); 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 && 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 * Make sure that the color and depth buffers are handled
* by independent memory controller units. Up to a 9x * by independent memory controller units. Up to a 9x
* speed up when alpha-blending and depth-test are enabled * speed up when alpha-blending and depth-test are enabled
* at the same time. * at the same time.
*/ */
int vram_pages = dev_priv->vram_size >> PAGE_SHIFT;
if (nvbo->tile_flags & NOUVEAU_GEM_TILE_ZETA) { if (nvbo->tile_flags & NOUVEAU_GEM_TILE_ZETA) {
nvbo->placement.fpfn = vram_pages / 2; nvbo->placement.fpfn = vram_pages / 2;
nvbo->placement.lpfn = ~0; nvbo->placement.lpfn = ~0;
...@@ -785,7 +786,7 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr, ...@@ -785,7 +786,7 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr,
if (ret) if (ret)
goto out; 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: out:
ttm_bo_mem_put(bo, &tmp_mem); ttm_bo_mem_put(bo, &tmp_mem);
return ret; return ret;
...@@ -811,11 +812,11 @@ nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr, ...@@ -811,11 +812,11 @@ nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr,
if (ret) if (ret)
return 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) if (ret)
goto out; 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) if (ret)
goto out; goto out;
......
...@@ -507,6 +507,7 @@ nouveau_connector_native_mode(struct drm_connector *connector) ...@@ -507,6 +507,7 @@ nouveau_connector_native_mode(struct drm_connector *connector)
int high_w = 0, high_h = 0, high_v = 0; int high_w = 0, high_h = 0, high_v = 0;
list_for_each_entry(mode, &nv_connector->base.probed_modes, head) { 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 || if (helper->mode_valid(connector, mode) != MODE_OK ||
(mode->flags & DRM_MODE_FLAG_INTERLACE)) (mode->flags & DRM_MODE_FLAG_INTERLACE))
continue; continue;
......
...@@ -543,7 +543,7 @@ nouveau_pm_resume(struct drm_device *dev) ...@@ -543,7 +543,7 @@ nouveau_pm_resume(struct drm_device *dev)
struct nouveau_pm_engine *pm = &dev_priv->engine.pm; struct nouveau_pm_engine *pm = &dev_priv->engine.pm;
struct nouveau_pm_level *perflvl; struct nouveau_pm_level *perflvl;
if (pm->cur == &pm->boot) if (!pm->cur || pm->cur == &pm->boot)
return; return;
perflvl = pm->cur; perflvl = pm->cur;
......
...@@ -342,8 +342,8 @@ static void nv04_dfp_mode_set(struct drm_encoder *encoder, ...@@ -342,8 +342,8 @@ static void nv04_dfp_mode_set(struct drm_encoder *encoder,
if (nv_encoder->dcb->type == OUTPUT_LVDS) { if (nv_encoder->dcb->type == OUTPUT_LVDS) {
bool duallink, dummy; bool duallink, dummy;
nouveau_bios_parse_lvds_table(dev, nv_connector->native_mode-> nouveau_bios_parse_lvds_table(dev, output_mode->clock,
clock, &duallink, &dummy); &duallink, &dummy);
if (duallink) if (duallink)
regp->fp_control |= (8 << 28); regp->fp_control |= (8 << 28);
} else } else
...@@ -518,8 +518,6 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode) ...@@ -518,8 +518,6 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode)
return; return;
if (nv_encoder->dcb->lvdsconf.use_power_scripts) { 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 /* when removing an output, crtc may not be set, but PANEL_OFF
* must still be run * must still be run
*/ */
...@@ -527,12 +525,8 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode) ...@@ -527,12 +525,8 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode)
nv04_dfp_get_bound_head(dev, nv_encoder->dcb); nv04_dfp_get_bound_head(dev, nv_encoder->dcb);
if (mode == DRM_MODE_DPMS_ON) { 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, call_lvds_script(dev, nv_encoder->dcb, head,
LVDS_PANEL_ON, nv_connector->native_mode->clock); LVDS_PANEL_ON, nv_encoder->mode.clock);
} else } else
/* pxclk of 0 is fine for PANEL_OFF, and for a /* pxclk of 0 is fine for PANEL_OFF, and for a
* disconnected LVDS encoder there is no native_mode * disconnected LVDS encoder there is no native_mode
......
...@@ -211,18 +211,32 @@ nv40_graph_set_tile_region(struct drm_device *dev, int i) ...@@ -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]; struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i];
switch (dev_priv->chipset) { 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 0x44:
case 0x4a: case 0x4a:
case 0x4e:
nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch); nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch);
nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit); nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit);
nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr); nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr);
break; break;
case 0x46: case 0x46:
case 0x47: case 0x47:
case 0x49: case 0x49:
case 0x4b: case 0x4b:
case 0x4c:
case 0x67:
default:
nv_wr32(dev, NV47_PGRAPH_TSIZE(i), tile->pitch); nv_wr32(dev, NV47_PGRAPH_TSIZE(i), tile->pitch);
nv_wr32(dev, NV47_PGRAPH_TLIMIT(i), tile->limit); nv_wr32(dev, NV47_PGRAPH_TLIMIT(i), tile->limit);
nv_wr32(dev, NV47_PGRAPH_TILE(i), tile->addr); nv_wr32(dev, NV47_PGRAPH_TILE(i), tile->addr);
...@@ -230,15 +244,6 @@ nv40_graph_set_tile_region(struct drm_device *dev, int i) ...@@ -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_TLIMIT1(i), tile->limit);
nv_wr32(dev, NV40_PGRAPH_TILE1(i), tile->addr); nv_wr32(dev, NV40_PGRAPH_TILE1(i), tile->addr);
break; 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) ...@@ -396,17 +401,20 @@ nv40_graph_init(struct drm_device *dev)
break; break;
default: default:
switch (dev_priv->chipset) { switch (dev_priv->chipset) {
case 0x46: case 0x41:
case 0x47: case 0x42:
case 0x49: case 0x43:
case 0x4b: case 0x45:
nv_wr32(dev, 0x400DF0, nv_rd32(dev, NV04_PFB_CFG0)); case 0x4e:
nv_wr32(dev, 0x400DF4, nv_rd32(dev, NV04_PFB_CFG1)); case 0x44:
break; case 0x4a:
default:
nv_wr32(dev, 0x4009F0, nv_rd32(dev, NV04_PFB_CFG0)); nv_wr32(dev, 0x4009F0, nv_rd32(dev, NV04_PFB_CFG0));
nv_wr32(dev, 0x4009F4, nv_rd32(dev, NV04_PFB_CFG1)); nv_wr32(dev, 0x4009F4, nv_rd32(dev, NV04_PFB_CFG1));
break; 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, 0x4069F0, nv_rd32(dev, NV04_PFB_CFG0));
nv_wr32(dev, 0x4069F4, nv_rd32(dev, NV04_PFB_CFG1)); nv_wr32(dev, 0x4069F4, nv_rd32(dev, NV04_PFB_CFG1));
......
...@@ -557,9 +557,9 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, ...@@ -557,9 +557,9 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
/* use recommended ref_div for ss */ /* use recommended ref_div for ss */
if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
pll->flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP;
if (ss_enabled) { if (ss_enabled) {
if (ss->refdiv) { if (ss->refdiv) {
pll->flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP;
pll->flags |= RADEON_PLL_USE_REF_DIV; pll->flags |= RADEON_PLL_USE_REF_DIV;
pll->reference_div = ss->refdiv; pll->reference_div = ss->refdiv;
if (ASIC_IS_AVIVO(rdev)) if (ASIC_IS_AVIVO(rdev))
...@@ -662,10 +662,12 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, ...@@ -662,10 +662,12 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
index, (uint32_t *)&args); index, (uint32_t *)&args);
adjusted_clock = le32_to_cpu(args.v3.sOutput.ulDispPllFreq) * 10; adjusted_clock = le32_to_cpu(args.v3.sOutput.ulDispPllFreq) * 10;
if (args.v3.sOutput.ucRefDiv) { if (args.v3.sOutput.ucRefDiv) {
pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV;
pll->flags |= RADEON_PLL_USE_REF_DIV; pll->flags |= RADEON_PLL_USE_REF_DIV;
pll->reference_div = args.v3.sOutput.ucRefDiv; pll->reference_div = args.v3.sOutput.ucRefDiv;
} }
if (args.v3.sOutput.ucPostDiv) { if (args.v3.sOutput.ucPostDiv) {
pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV;
pll->flags |= RADEON_PLL_USE_POST_DIV; pll->flags |= RADEON_PLL_USE_POST_DIV;
pll->post_div = args.v3.sOutput.ucPostDiv; pll->post_div = args.v3.sOutput.ucPostDiv;
} }
......
...@@ -910,6 +910,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, ...@@ -910,6 +910,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
track->textures[i].compress_format = R100_TRACK_COMP_NONE; track->textures[i].compress_format = R100_TRACK_COMP_NONE;
break; break;
case R300_TX_FORMAT_X16: case R300_TX_FORMAT_X16:
case R300_TX_FORMAT_FL_I16:
case R300_TX_FORMAT_Y8X8: case R300_TX_FORMAT_Y8X8:
case R300_TX_FORMAT_Z5Y6X5: case R300_TX_FORMAT_Z5Y6X5:
case R300_TX_FORMAT_Z6Y5X5: case R300_TX_FORMAT_Z6Y5X5:
...@@ -922,6 +923,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, ...@@ -922,6 +923,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
track->textures[i].compress_format = R100_TRACK_COMP_NONE; track->textures[i].compress_format = R100_TRACK_COMP_NONE;
break; break;
case R300_TX_FORMAT_Y16X16: case R300_TX_FORMAT_Y16X16:
case R300_TX_FORMAT_FL_I16A16:
case R300_TX_FORMAT_Z11Y11X10: case R300_TX_FORMAT_Z11Y11X10:
case R300_TX_FORMAT_Z10Y11X11: case R300_TX_FORMAT_Z10Y11X11:
case R300_TX_FORMAT_W8Z8Y8X8: case R300_TX_FORMAT_W8Z8Y8X8:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册