diff options
| -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, | |||
| 6228 | entry->tvconf.has_component_output = false; | 6228 | entry->tvconf.has_component_output = false; |
| 6229 | break; | 6229 | break; |
| 6230 | case OUTPUT_LVDS: | 6230 | case OUTPUT_LVDS: |
| 6231 | if ((conn & 0x00003f00) != 0x10) | 6231 | if ((conn & 0x00003f00) >> 8 != 0x10) |
| 6232 | entry->lvdsconf.use_straps_for_mode = true; | 6232 | entry->lvdsconf.use_straps_for_mode = true; |
| 6233 | entry->lvdsconf.use_power_scripts = true; | 6233 | entry->lvdsconf.use_power_scripts = true; |
| 6234 | break; | 6234 | 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, | |||
| 128 | } | 128 | } |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | nvbo->bo.mem.num_pages = size >> PAGE_SHIFT; | ||
| 131 | nouveau_bo_placement_set(nvbo, flags, 0); | 132 | nouveau_bo_placement_set(nvbo, flags, 0); |
| 132 | 133 | ||
| 133 | nvbo->channel = chan; | 134 | nvbo->channel = chan; |
| @@ -166,17 +167,17 @@ static void | |||
| 166 | set_placement_range(struct nouveau_bo *nvbo, uint32_t type) | 167 | set_placement_range(struct nouveau_bo *nvbo, uint32_t type) |
| 167 | { | 168 | { |
| 168 | struct drm_nouveau_private *dev_priv = nouveau_bdev(nvbo->bo.bdev); | 169 | struct drm_nouveau_private *dev_priv = nouveau_bdev(nvbo->bo.bdev); |
| 170 | int vram_pages = dev_priv->vram_size >> PAGE_SHIFT; | ||
| 169 | 171 | ||
| 170 | if (dev_priv->card_type == NV_10 && | 172 | if (dev_priv->card_type == NV_10 && |
| 171 | nvbo->tile_mode && (type & TTM_PL_FLAG_VRAM)) { | 173 | nvbo->tile_mode && (type & TTM_PL_FLAG_VRAM) && |
| 174 | nvbo->bo.mem.num_pages < vram_pages / 2) { | ||
| 172 | /* | 175 | /* |
| 173 | * Make sure that the color and depth buffers are handled | 176 | * Make sure that the color and depth buffers are handled |
| 174 | * by independent memory controller units. Up to a 9x | 177 | * by independent memory controller units. Up to a 9x |
| 175 | * speed up when alpha-blending and depth-test are enabled | 178 | * speed up when alpha-blending and depth-test are enabled |
| 176 | * at the same time. | 179 | * at the same time. |
| 177 | */ | 180 | */ |
| 178 | int vram_pages = dev_priv->vram_size >> PAGE_SHIFT; | ||
| 179 | |||
| 180 | if (nvbo->tile_flags & NOUVEAU_GEM_TILE_ZETA) { | 181 | if (nvbo->tile_flags & NOUVEAU_GEM_TILE_ZETA) { |
| 181 | nvbo->placement.fpfn = vram_pages / 2; | 182 | nvbo->placement.fpfn = vram_pages / 2; |
| 182 | nvbo->placement.lpfn = ~0; | 183 | nvbo->placement.lpfn = ~0; |
| @@ -785,7 +786,7 @@ nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr, | |||
| 785 | if (ret) | 786 | if (ret) |
| 786 | goto out; | 787 | goto out; |
| 787 | 788 | ||
| 788 | ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu, new_mem); | 789 | ret = ttm_bo_move_ttm(bo, true, no_wait_reserve, no_wait_gpu, new_mem); |
| 789 | out: | 790 | out: |
| 790 | ttm_bo_mem_put(bo, &tmp_mem); | 791 | ttm_bo_mem_put(bo, &tmp_mem); |
| 791 | return ret; | 792 | return ret; |
| @@ -811,11 +812,11 @@ nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr, | |||
| 811 | if (ret) | 812 | if (ret) |
| 812 | return ret; | 813 | return ret; |
| 813 | 814 | ||
| 814 | ret = ttm_bo_move_ttm(bo, evict, no_wait_reserve, no_wait_gpu, &tmp_mem); | 815 | ret = ttm_bo_move_ttm(bo, true, no_wait_reserve, no_wait_gpu, &tmp_mem); |
| 815 | if (ret) | 816 | if (ret) |
| 816 | goto out; | 817 | goto out; |
| 817 | 818 | ||
| 818 | ret = nouveau_bo_move_m2mf(bo, evict, intr, no_wait_reserve, no_wait_gpu, new_mem); | 819 | ret = nouveau_bo_move_m2mf(bo, true, intr, no_wait_reserve, no_wait_gpu, new_mem); |
| 819 | if (ret) | 820 | if (ret) |
| 820 | goto out; | 821 | goto out; |
| 821 | 822 | ||
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) | |||
| 507 | int high_w = 0, high_h = 0, high_v = 0; | 507 | int high_w = 0, high_h = 0, high_v = 0; |
| 508 | 508 | ||
| 509 | list_for_each_entry(mode, &nv_connector->base.probed_modes, head) { | 509 | list_for_each_entry(mode, &nv_connector->base.probed_modes, head) { |
| 510 | mode->vrefresh = drm_mode_vrefresh(mode); | ||
| 510 | if (helper->mode_valid(connector, mode) != MODE_OK || | 511 | if (helper->mode_valid(connector, mode) != MODE_OK || |
| 511 | (mode->flags & DRM_MODE_FLAG_INTERLACE)) | 512 | (mode->flags & DRM_MODE_FLAG_INTERLACE)) |
| 512 | continue; | 513 | 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) | |||
| 543 | struct nouveau_pm_engine *pm = &dev_priv->engine.pm; | 543 | struct nouveau_pm_engine *pm = &dev_priv->engine.pm; |
| 544 | struct nouveau_pm_level *perflvl; | 544 | struct nouveau_pm_level *perflvl; |
| 545 | 545 | ||
| 546 | if (pm->cur == &pm->boot) | 546 | if (!pm->cur || pm->cur == &pm->boot) |
| 547 | return; | 547 | return; |
| 548 | 548 | ||
| 549 | perflvl = pm->cur; | 549 | 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, | |||
| 342 | if (nv_encoder->dcb->type == OUTPUT_LVDS) { | 342 | if (nv_encoder->dcb->type == OUTPUT_LVDS) { |
| 343 | bool duallink, dummy; | 343 | bool duallink, dummy; |
| 344 | 344 | ||
| 345 | nouveau_bios_parse_lvds_table(dev, nv_connector->native_mode-> | 345 | nouveau_bios_parse_lvds_table(dev, output_mode->clock, |
| 346 | clock, &duallink, &dummy); | 346 | &duallink, &dummy); |
| 347 | if (duallink) | 347 | if (duallink) |
| 348 | regp->fp_control |= (8 << 28); | 348 | regp->fp_control |= (8 << 28); |
| 349 | } else | 349 | } else |
| @@ -518,8 +518,6 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode) | |||
| 518 | return; | 518 | return; |
| 519 | 519 | ||
| 520 | if (nv_encoder->dcb->lvdsconf.use_power_scripts) { | 520 | if (nv_encoder->dcb->lvdsconf.use_power_scripts) { |
| 521 | struct nouveau_connector *nv_connector = nouveau_encoder_connector_get(nv_encoder); | ||
| 522 | |||
| 523 | /* when removing an output, crtc may not be set, but PANEL_OFF | 521 | /* when removing an output, crtc may not be set, but PANEL_OFF |
| 524 | * must still be run | 522 | * must still be run |
| 525 | */ | 523 | */ |
| @@ -527,12 +525,8 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode) | |||
| 527 | nv04_dfp_get_bound_head(dev, nv_encoder->dcb); | 525 | nv04_dfp_get_bound_head(dev, nv_encoder->dcb); |
| 528 | 526 | ||
| 529 | if (mode == DRM_MODE_DPMS_ON) { | 527 | if (mode == DRM_MODE_DPMS_ON) { |
| 530 | if (!nv_connector->native_mode) { | ||
| 531 | NV_ERROR(dev, "Not turning on LVDS without native mode\n"); | ||
| 532 | return; | ||
| 533 | } | ||
| 534 | call_lvds_script(dev, nv_encoder->dcb, head, | 528 | call_lvds_script(dev, nv_encoder->dcb, head, |
| 535 | LVDS_PANEL_ON, nv_connector->native_mode->clock); | 529 | LVDS_PANEL_ON, nv_encoder->mode.clock); |
| 536 | } else | 530 | } else |
| 537 | /* pxclk of 0 is fine for PANEL_OFF, and for a | 531 | /* pxclk of 0 is fine for PANEL_OFF, and for a |
| 538 | * disconnected LVDS encoder there is no native_mode | 532 | * 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) | |||
| 211 | struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i]; | 211 | struct nouveau_tile_reg *tile = &dev_priv->tile.reg[i]; |
| 212 | 212 | ||
| 213 | switch (dev_priv->chipset) { | 213 | switch (dev_priv->chipset) { |
| 214 | case 0x40: | ||
| 215 | case 0x41: /* guess */ | ||
| 216 | case 0x42: | ||
| 217 | case 0x43: | ||
| 218 | case 0x45: /* guess */ | ||
| 219 | case 0x4e: | ||
| 220 | nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch); | ||
| 221 | nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit); | ||
| 222 | nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr); | ||
| 223 | nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tile->pitch); | ||
| 224 | nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tile->limit); | ||
| 225 | nv_wr32(dev, NV40_PGRAPH_TILE1(i), tile->addr); | ||
| 226 | break; | ||
| 214 | case 0x44: | 227 | case 0x44: |
| 215 | case 0x4a: | 228 | case 0x4a: |
| 216 | case 0x4e: | ||
| 217 | nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch); | 229 | nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch); |
| 218 | nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit); | 230 | nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit); |
| 219 | nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr); | 231 | nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr); |
| 220 | break; | 232 | break; |
| 221 | |||
| 222 | case 0x46: | 233 | case 0x46: |
| 223 | case 0x47: | 234 | case 0x47: |
| 224 | case 0x49: | 235 | case 0x49: |
| 225 | case 0x4b: | 236 | case 0x4b: |
| 237 | case 0x4c: | ||
| 238 | case 0x67: | ||
| 239 | default: | ||
| 226 | nv_wr32(dev, NV47_PGRAPH_TSIZE(i), tile->pitch); | 240 | nv_wr32(dev, NV47_PGRAPH_TSIZE(i), tile->pitch); |
| 227 | nv_wr32(dev, NV47_PGRAPH_TLIMIT(i), tile->limit); | 241 | nv_wr32(dev, NV47_PGRAPH_TLIMIT(i), tile->limit); |
| 228 | nv_wr32(dev, NV47_PGRAPH_TILE(i), tile->addr); | 242 | 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 | nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tile->limit); | 244 | nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tile->limit); |
| 231 | nv_wr32(dev, NV40_PGRAPH_TILE1(i), tile->addr); | 245 | nv_wr32(dev, NV40_PGRAPH_TILE1(i), tile->addr); |
| 232 | break; | 246 | break; |
| 233 | |||
| 234 | default: | ||
| 235 | nv_wr32(dev, NV20_PGRAPH_TSIZE(i), tile->pitch); | ||
| 236 | nv_wr32(dev, NV20_PGRAPH_TLIMIT(i), tile->limit); | ||
| 237 | nv_wr32(dev, NV20_PGRAPH_TILE(i), tile->addr); | ||
| 238 | nv_wr32(dev, NV40_PGRAPH_TSIZE1(i), tile->pitch); | ||
| 239 | nv_wr32(dev, NV40_PGRAPH_TLIMIT1(i), tile->limit); | ||
| 240 | nv_wr32(dev, NV40_PGRAPH_TILE1(i), tile->addr); | ||
| 241 | break; | ||
| 242 | } | 247 | } |
| 243 | } | 248 | } |
| 244 | 249 | ||
| @@ -396,17 +401,20 @@ nv40_graph_init(struct drm_device *dev) | |||
| 396 | break; | 401 | break; |
| 397 | default: | 402 | default: |
| 398 | switch (dev_priv->chipset) { | 403 | switch (dev_priv->chipset) { |
| 399 | case 0x46: | 404 | case 0x41: |
| 400 | case 0x47: | 405 | case 0x42: |
| 401 | case 0x49: | 406 | case 0x43: |
| 402 | case 0x4b: | 407 | case 0x45: |
| 403 | nv_wr32(dev, 0x400DF0, nv_rd32(dev, NV04_PFB_CFG0)); | 408 | case 0x4e: |
| 404 | nv_wr32(dev, 0x400DF4, nv_rd32(dev, NV04_PFB_CFG1)); | 409 | case 0x44: |
| 405 | break; | 410 | case 0x4a: |
| 406 | default: | ||
| 407 | nv_wr32(dev, 0x4009F0, nv_rd32(dev, NV04_PFB_CFG0)); | 411 | nv_wr32(dev, 0x4009F0, nv_rd32(dev, NV04_PFB_CFG0)); |
| 408 | nv_wr32(dev, 0x4009F4, nv_rd32(dev, NV04_PFB_CFG1)); | 412 | nv_wr32(dev, 0x4009F4, nv_rd32(dev, NV04_PFB_CFG1)); |
| 409 | break; | 413 | break; |
| 414 | default: | ||
| 415 | nv_wr32(dev, 0x400DF0, nv_rd32(dev, NV04_PFB_CFG0)); | ||
| 416 | nv_wr32(dev, 0x400DF4, nv_rd32(dev, NV04_PFB_CFG1)); | ||
| 417 | break; | ||
| 410 | } | 418 | } |
| 411 | nv_wr32(dev, 0x4069F0, nv_rd32(dev, NV04_PFB_CFG0)); | 419 | nv_wr32(dev, 0x4069F0, nv_rd32(dev, NV04_PFB_CFG0)); |
| 412 | nv_wr32(dev, 0x4069F4, nv_rd32(dev, NV04_PFB_CFG1)); | 420 | nv_wr32(dev, 0x4069F4, nv_rd32(dev, NV04_PFB_CFG1)); |
