diff options
| -rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_fence.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_sgdma.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv04_crtc.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv50_crtc.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 37 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 19 |
7 files changed, 66 insertions, 28 deletions
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 802b61ac3139..f7c6854eb4dd 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
| @@ -256,7 +256,6 @@ int drm_fb_helper_panic(struct notifier_block *n, unsigned long ununsed, | |||
| 256 | { | 256 | { |
| 257 | printk(KERN_ERR "panic occurred, switching back to text console\n"); | 257 | printk(KERN_ERR "panic occurred, switching back to text console\n"); |
| 258 | return drm_fb_helper_force_kernel_mode(); | 258 | return drm_fb_helper_force_kernel_mode(); |
| 259 | return 0; | ||
| 260 | } | 259 | } |
| 261 | EXPORT_SYMBOL(drm_fb_helper_panic); | 260 | EXPORT_SYMBOL(drm_fb_helper_panic); |
| 262 | 261 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c index 8d02d875376d..c919cfc8f2fd 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fence.c +++ b/drivers/gpu/drm/nouveau/nouveau_fence.c | |||
| @@ -530,7 +530,8 @@ nouveau_fence_channel_init(struct nouveau_channel *chan) | |||
| 530 | nouveau_gpuobj_ref(NULL, &obj); | 530 | nouveau_gpuobj_ref(NULL, &obj); |
| 531 | if (ret) | 531 | if (ret) |
| 532 | return ret; | 532 | return ret; |
| 533 | } else { | 533 | } else |
| 534 | if (USE_SEMA(dev)) { | ||
| 534 | /* map fence bo into channel's vm */ | 535 | /* map fence bo into channel's vm */ |
| 535 | ret = nouveau_bo_vma_add(dev_priv->fence.bo, chan->vm, | 536 | ret = nouveau_bo_vma_add(dev_priv->fence.bo, chan->vm, |
| 536 | &chan->fence.vma); | 537 | &chan->fence.vma); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c index c444cadbf849..2706cb3d871a 100644 --- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c +++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c | |||
| @@ -37,8 +37,11 @@ nouveau_sgdma_populate(struct ttm_backend *be, unsigned long num_pages, | |||
| 37 | return -ENOMEM; | 37 | return -ENOMEM; |
| 38 | 38 | ||
| 39 | nvbe->ttm_alloced = kmalloc(sizeof(bool) * num_pages, GFP_KERNEL); | 39 | nvbe->ttm_alloced = kmalloc(sizeof(bool) * num_pages, GFP_KERNEL); |
| 40 | if (!nvbe->ttm_alloced) | 40 | if (!nvbe->ttm_alloced) { |
| 41 | kfree(nvbe->pages); | ||
| 42 | nvbe->pages = NULL; | ||
| 41 | return -ENOMEM; | 43 | return -ENOMEM; |
| 44 | } | ||
| 42 | 45 | ||
| 43 | nvbe->nr_pages = 0; | 46 | nvbe->nr_pages = 0; |
| 44 | while (num_pages--) { | 47 | while (num_pages--) { |
| @@ -126,7 +129,7 @@ nv04_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem) | |||
| 126 | 129 | ||
| 127 | for (j = 0; j < PAGE_SIZE / NV_CTXDMA_PAGE_SIZE; j++, pte++) { | 130 | for (j = 0; j < PAGE_SIZE / NV_CTXDMA_PAGE_SIZE; j++, pte++) { |
| 128 | nv_wo32(gpuobj, (pte * 4) + 0, offset_l | 3); | 131 | nv_wo32(gpuobj, (pte * 4) + 0, offset_l | 3); |
| 129 | dma_offset += NV_CTXDMA_PAGE_SIZE; | 132 | offset_l += NV_CTXDMA_PAGE_SIZE; |
| 130 | } | 133 | } |
| 131 | } | 134 | } |
| 132 | 135 | ||
diff --git a/drivers/gpu/drm/nouveau/nv04_crtc.c b/drivers/gpu/drm/nouveau/nv04_crtc.c index 118261d4927a..5e45398a9e2d 100644 --- a/drivers/gpu/drm/nouveau/nv04_crtc.c +++ b/drivers/gpu/drm/nouveau/nv04_crtc.c | |||
| @@ -781,11 +781,20 @@ nv04_crtc_do_mode_set_base(struct drm_crtc *crtc, | |||
| 781 | struct drm_device *dev = crtc->dev; | 781 | struct drm_device *dev = crtc->dev; |
| 782 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 782 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 783 | struct nv04_crtc_reg *regp = &dev_priv->mode_reg.crtc_reg[nv_crtc->index]; | 783 | struct nv04_crtc_reg *regp = &dev_priv->mode_reg.crtc_reg[nv_crtc->index]; |
| 784 | struct drm_framebuffer *drm_fb = nv_crtc->base.fb; | 784 | struct drm_framebuffer *drm_fb; |
| 785 | struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb); | 785 | struct nouveau_framebuffer *fb; |
| 786 | int arb_burst, arb_lwm; | 786 | int arb_burst, arb_lwm; |
| 787 | int ret; | 787 | int ret; |
| 788 | 788 | ||
| 789 | NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index); | ||
| 790 | |||
| 791 | /* no fb bound */ | ||
| 792 | if (!atomic && !crtc->fb) { | ||
| 793 | NV_DEBUG_KMS(dev, "No FB bound\n"); | ||
| 794 | return 0; | ||
| 795 | } | ||
| 796 | |||
| 797 | |||
| 789 | /* If atomic, we want to switch to the fb we were passed, so | 798 | /* If atomic, we want to switch to the fb we were passed, so |
| 790 | * now we update pointers to do that. (We don't pin; just | 799 | * now we update pointers to do that. (We don't pin; just |
| 791 | * assume we're already pinned and update the base address.) | 800 | * assume we're already pinned and update the base address.) |
| @@ -794,6 +803,8 @@ nv04_crtc_do_mode_set_base(struct drm_crtc *crtc, | |||
| 794 | drm_fb = passed_fb; | 803 | drm_fb = passed_fb; |
| 795 | fb = nouveau_framebuffer(passed_fb); | 804 | fb = nouveau_framebuffer(passed_fb); |
| 796 | } else { | 805 | } else { |
| 806 | drm_fb = crtc->fb; | ||
| 807 | fb = nouveau_framebuffer(crtc->fb); | ||
| 797 | /* If not atomic, we can go ahead and pin, and unpin the | 808 | /* If not atomic, we can go ahead and pin, and unpin the |
| 798 | * old fb we were passed. | 809 | * old fb we were passed. |
| 799 | */ | 810 | */ |
diff --git a/drivers/gpu/drm/nouveau/nv50_crtc.c b/drivers/gpu/drm/nouveau/nv50_crtc.c index 46ad59ea2185..5d989073ba6e 100644 --- a/drivers/gpu/drm/nouveau/nv50_crtc.c +++ b/drivers/gpu/drm/nouveau/nv50_crtc.c | |||
| @@ -519,12 +519,18 @@ nv50_crtc_do_mode_set_base(struct drm_crtc *crtc, | |||
| 519 | struct drm_device *dev = nv_crtc->base.dev; | 519 | struct drm_device *dev = nv_crtc->base.dev; |
| 520 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 520 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 521 | struct nouveau_channel *evo = nv50_display(dev)->master; | 521 | struct nouveau_channel *evo = nv50_display(dev)->master; |
| 522 | struct drm_framebuffer *drm_fb = nv_crtc->base.fb; | 522 | struct drm_framebuffer *drm_fb; |
| 523 | struct nouveau_framebuffer *fb = nouveau_framebuffer(drm_fb); | 523 | struct nouveau_framebuffer *fb; |
| 524 | int ret; | 524 | int ret; |
| 525 | 525 | ||
| 526 | NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index); | 526 | NV_DEBUG_KMS(dev, "index %d\n", nv_crtc->index); |
| 527 | 527 | ||
| 528 | /* no fb bound */ | ||
| 529 | if (!atomic && !crtc->fb) { | ||
| 530 | NV_DEBUG_KMS(dev, "No FB bound\n"); | ||
| 531 | return 0; | ||
| 532 | } | ||
| 533 | |||
| 528 | /* If atomic, we want to switch to the fb we were passed, so | 534 | /* If atomic, we want to switch to the fb we were passed, so |
| 529 | * now we update pointers to do that. (We don't pin; just | 535 | * now we update pointers to do that. (We don't pin; just |
| 530 | * assume we're already pinned and update the base address.) | 536 | * assume we're already pinned and update the base address.) |
| @@ -533,6 +539,8 @@ nv50_crtc_do_mode_set_base(struct drm_crtc *crtc, | |||
| 533 | drm_fb = passed_fb; | 539 | drm_fb = passed_fb; |
| 534 | fb = nouveau_framebuffer(passed_fb); | 540 | fb = nouveau_framebuffer(passed_fb); |
| 535 | } else { | 541 | } else { |
| 542 | drm_fb = crtc->fb; | ||
| 543 | fb = nouveau_framebuffer(crtc->fb); | ||
| 536 | /* If not atomic, we can go ahead and pin, and unpin the | 544 | /* If not atomic, we can go ahead and pin, and unpin the |
| 537 | * old fb we were passed. | 545 | * old fb we were passed. |
| 538 | */ | 546 | */ |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 4f0c1ecac72e..c4b8741dbf58 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -1297,12 +1297,33 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | |||
| 1297 | if (!radeon_dig_connector->edp_on) | 1297 | if (!radeon_dig_connector->edp_on) |
| 1298 | atombios_set_edp_panel_power(connector, | 1298 | atombios_set_edp_panel_power(connector, |
| 1299 | ATOM_TRANSMITTER_ACTION_POWER_OFF); | 1299 | ATOM_TRANSMITTER_ACTION_POWER_OFF); |
| 1300 | } else { | 1300 | } else if (radeon_connector_encoder_is_dp_bridge(connector)) { |
| 1301 | /* need to setup ddc on the bridge */ | 1301 | /* DP bridges are always DP */ |
| 1302 | if (radeon_connector_encoder_is_dp_bridge(connector)) { | 1302 | radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT; |
| 1303 | /* get the DPCD from the bridge */ | ||
| 1304 | radeon_dp_getdpcd(radeon_connector); | ||
| 1305 | |||
| 1306 | if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) | ||
| 1307 | ret = connector_status_connected; | ||
| 1308 | else { | ||
| 1309 | /* need to setup ddc on the bridge */ | ||
| 1303 | if (encoder) | 1310 | if (encoder) |
| 1304 | radeon_atom_ext_encoder_setup_ddc(encoder); | 1311 | radeon_atom_ext_encoder_setup_ddc(encoder); |
| 1312 | if (radeon_ddc_probe(radeon_connector, | ||
| 1313 | radeon_connector->requires_extended_probe)) | ||
| 1314 | ret = connector_status_connected; | ||
| 1315 | } | ||
| 1316 | |||
| 1317 | if ((ret == connector_status_disconnected) && | ||
| 1318 | radeon_connector->dac_load_detect) { | ||
| 1319 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); | ||
| 1320 | struct drm_encoder_helper_funcs *encoder_funcs; | ||
| 1321 | if (encoder) { | ||
| 1322 | encoder_funcs = encoder->helper_private; | ||
| 1323 | ret = encoder_funcs->detect(encoder, connector); | ||
| 1324 | } | ||
| 1305 | } | 1325 | } |
| 1326 | } else { | ||
| 1306 | radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector); | 1327 | radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector); |
| 1307 | if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { | 1328 | if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { |
| 1308 | ret = connector_status_connected; | 1329 | ret = connector_status_connected; |
| @@ -1318,16 +1339,6 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | |||
| 1318 | ret = connector_status_connected; | 1339 | ret = connector_status_connected; |
| 1319 | } | 1340 | } |
| 1320 | } | 1341 | } |
| 1321 | |||
| 1322 | if ((ret == connector_status_disconnected) && | ||
| 1323 | radeon_connector->dac_load_detect) { | ||
| 1324 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); | ||
| 1325 | struct drm_encoder_helper_funcs *encoder_funcs; | ||
| 1326 | if (encoder) { | ||
| 1327 | encoder_funcs = encoder->helper_private; | ||
| 1328 | ret = encoder_funcs->detect(encoder, connector); | ||
| 1329 | } | ||
| 1330 | } | ||
| 1331 | } | 1342 | } |
| 1332 | 1343 | ||
| 1333 | radeon_connector_update_scratch_regs(connector, ret); | 1344 | radeon_connector_update_scratch_regs(connector, ret); |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 1a858944e4f3..6cc17fb96a57 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -707,16 +707,21 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) | |||
| 707 | radeon_router_select_ddc_port(radeon_connector); | 707 | radeon_router_select_ddc_port(radeon_connector); |
| 708 | 708 | ||
| 709 | if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || | 709 | if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || |
| 710 | (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) { | 710 | (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) || |
| 711 | radeon_connector_encoder_is_dp_bridge(&radeon_connector->base)) { | ||
| 711 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | 712 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; |
| 713 | |||
| 712 | if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT || | 714 | if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT || |
| 713 | dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) && dig->dp_i2c_bus) | 715 | dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) && dig->dp_i2c_bus) |
| 714 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, &dig->dp_i2c_bus->adapter); | 716 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, |
| 715 | } | 717 | &dig->dp_i2c_bus->adapter); |
| 716 | if (!radeon_connector->ddc_bus) | 718 | else if (radeon_connector->ddc_bus && !radeon_connector->edid) |
| 717 | return -1; | 719 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, |
| 718 | if (!radeon_connector->edid) { | 720 | &radeon_connector->ddc_bus->adapter); |
| 719 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter); | 721 | } else { |
| 722 | if (radeon_connector->ddc_bus && !radeon_connector->edid) | ||
| 723 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, | ||
| 724 | &radeon_connector->ddc_bus->adapter); | ||
| 720 | } | 725 | } |
| 721 | 726 | ||
| 722 | if (!radeon_connector->edid) { | 727 | if (!radeon_connector->edid) { |
