diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-03 19:40:21 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-03 19:40:21 -0500 |
| commit | 0cb65c83304a341b9d09678448d7c8b550689531 (patch) | |
| tree | ef0c7158b4c065feb39fa59dbeea1d68b5eac2c0 | |
| parent | 3c49de52d5647cda8b42c4255cf8a29d1e22eff5 (diff) | |
| parent | ab7cd8d83e5dba13027de66f1b008b08b30b71a4 (diff) | |
Merge tag 'drm-fixes-for-v4.9-rc8' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie:
"A pretty small pull request: a couple of AMD powerxpress regression
fixes and a power management fix, a couple of i915 fixes and one hdlcd
fix, along with one core don't oops because of incorrect API usage fix"
* tag 'drm-fixes-for-v4.9-rc8' of git://people.freedesktop.org/~airlied/linux:
drm/i915: drop the struct_mutex when wedged or trying to reset
drm/i915: Don't touch NULL sg on i915_gem_object_get_pages_gtt() error
drm: Don't call drm_for_each_crtc with a non-KMS driver
drm/radeon: fix check for port PM availability
drm/amdgpu: fix check for port PM availability
drm/amd/powerplay: initialize the soft_regs offset in struct smu7_hwmgr
drm: hdlcd: Fix cleanup order
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/arm/hdlcd_drv.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_ioctl.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_atpx_handler.c | 11 |
7 files changed, 34 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c index 02ca5dd978f6..6c343a933182 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c | |||
| @@ -485,7 +485,6 @@ static int amdgpu_atpx_power_state(enum vga_switcheroo_client_id id, | |||
| 485 | */ | 485 | */ |
| 486 | static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev) | 486 | static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev) |
| 487 | { | 487 | { |
| 488 | struct pci_dev *parent_pdev = pci_upstream_bridge(pdev); | ||
| 489 | acpi_handle dhandle, atpx_handle; | 488 | acpi_handle dhandle, atpx_handle; |
| 490 | acpi_status status; | 489 | acpi_status status; |
| 491 | 490 | ||
| @@ -500,7 +499,6 @@ static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev) | |||
| 500 | } | 499 | } |
| 501 | amdgpu_atpx_priv.dhandle = dhandle; | 500 | amdgpu_atpx_priv.dhandle = dhandle; |
| 502 | amdgpu_atpx_priv.atpx.handle = atpx_handle; | 501 | amdgpu_atpx_priv.atpx.handle = atpx_handle; |
| 503 | amdgpu_atpx_priv.bridge_pm_usable = parent_pdev && parent_pdev->bridge_d3; | ||
| 504 | return true; | 502 | return true; |
| 505 | } | 503 | } |
| 506 | 504 | ||
| @@ -562,17 +560,25 @@ static bool amdgpu_atpx_detect(void) | |||
| 562 | struct pci_dev *pdev = NULL; | 560 | struct pci_dev *pdev = NULL; |
| 563 | bool has_atpx = false; | 561 | bool has_atpx = false; |
| 564 | int vga_count = 0; | 562 | int vga_count = 0; |
| 563 | bool d3_supported = false; | ||
| 564 | struct pci_dev *parent_pdev; | ||
| 565 | 565 | ||
| 566 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { | 566 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { |
| 567 | vga_count++; | 567 | vga_count++; |
| 568 | 568 | ||
| 569 | has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); | 569 | has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); |
| 570 | |||
| 571 | parent_pdev = pci_upstream_bridge(pdev); | ||
| 572 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; | ||
| 570 | } | 573 | } |
| 571 | 574 | ||
| 572 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { | 575 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { |
| 573 | vga_count++; | 576 | vga_count++; |
| 574 | 577 | ||
| 575 | has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); | 578 | has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); |
| 579 | |||
| 580 | parent_pdev = pci_upstream_bridge(pdev); | ||
| 581 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; | ||
| 576 | } | 582 | } |
| 577 | 583 | ||
| 578 | if (has_atpx && vga_count == 2) { | 584 | if (has_atpx && vga_count == 2) { |
| @@ -580,6 +586,7 @@ static bool amdgpu_atpx_detect(void) | |||
| 580 | printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", | 586 | printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", |
| 581 | acpi_method_name); | 587 | acpi_method_name); |
| 582 | amdgpu_atpx_priv.atpx_detected = true; | 588 | amdgpu_atpx_priv.atpx_detected = true; |
| 589 | amdgpu_atpx_priv.bridge_pm_usable = d3_supported; | ||
| 583 | amdgpu_atpx_init(); | 590 | amdgpu_atpx_init(); |
| 584 | return true; | 591 | return true; |
| 585 | } | 592 | } |
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c index 4ccc0b72324d..71bb2f8dc157 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c | |||
| @@ -2214,6 +2214,7 @@ uint32_t polaris10_get_mac_definition(uint32_t value) | |||
| 2214 | int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr) | 2214 | int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr) |
| 2215 | { | 2215 | { |
| 2216 | struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend); | 2216 | struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend); |
| 2217 | struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); | ||
| 2217 | uint32_t tmp; | 2218 | uint32_t tmp; |
| 2218 | int result; | 2219 | int result; |
| 2219 | bool error = false; | 2220 | bool error = false; |
| @@ -2233,8 +2234,10 @@ int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr) | |||
| 2233 | offsetof(SMU74_Firmware_Header, SoftRegisters), | 2234 | offsetof(SMU74_Firmware_Header, SoftRegisters), |
| 2234 | &tmp, SMC_RAM_END); | 2235 | &tmp, SMC_RAM_END); |
| 2235 | 2236 | ||
| 2236 | if (!result) | 2237 | if (!result) { |
| 2238 | data->soft_regs_start = tmp; | ||
| 2237 | smu_data->smu7_data.soft_regs_start = tmp; | 2239 | smu_data->smu7_data.soft_regs_start = tmp; |
| 2240 | } | ||
| 2238 | 2241 | ||
| 2239 | error |= (0 != result); | 2242 | error |= (0 != result); |
| 2240 | 2243 | ||
diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c index fb6a418ce6be..e138fb51e8ce 100644 --- a/drivers/gpu/drm/arm/hdlcd_drv.c +++ b/drivers/gpu/drm/arm/hdlcd_drv.c | |||
| @@ -375,7 +375,6 @@ static int hdlcd_drm_bind(struct device *dev) | |||
| 375 | 375 | ||
| 376 | err_fbdev: | 376 | err_fbdev: |
| 377 | drm_kms_helper_poll_fini(drm); | 377 | drm_kms_helper_poll_fini(drm); |
| 378 | drm_mode_config_cleanup(drm); | ||
| 379 | drm_vblank_cleanup(drm); | 378 | drm_vblank_cleanup(drm); |
| 380 | err_vblank: | 379 | err_vblank: |
| 381 | pm_runtime_disable(drm->dev); | 380 | pm_runtime_disable(drm->dev); |
| @@ -387,6 +386,7 @@ err_unload: | |||
| 387 | drm_irq_uninstall(drm); | 386 | drm_irq_uninstall(drm); |
| 388 | of_reserved_mem_device_release(drm->dev); | 387 | of_reserved_mem_device_release(drm->dev); |
| 389 | err_free: | 388 | err_free: |
| 389 | drm_mode_config_cleanup(drm); | ||
| 390 | dev_set_drvdata(dev, NULL); | 390 | dev_set_drvdata(dev, NULL); |
| 391 | drm_dev_unref(drm); | 391 | drm_dev_unref(drm); |
| 392 | 392 | ||
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index 0ad2c47f808f..71c3473476c7 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c | |||
| @@ -254,10 +254,12 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_ | |||
| 254 | req->value = dev->mode_config.async_page_flip; | 254 | req->value = dev->mode_config.async_page_flip; |
| 255 | break; | 255 | break; |
| 256 | case DRM_CAP_PAGE_FLIP_TARGET: | 256 | case DRM_CAP_PAGE_FLIP_TARGET: |
| 257 | req->value = 1; | 257 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { |
| 258 | drm_for_each_crtc(crtc, dev) { | 258 | req->value = 1; |
| 259 | if (!crtc->funcs->page_flip_target) | 259 | drm_for_each_crtc(crtc, dev) { |
| 260 | req->value = 0; | 260 | if (!crtc->funcs->page_flip_target) |
| 261 | req->value = 0; | ||
| 262 | } | ||
| 261 | } | 263 | } |
| 262 | break; | 264 | break; |
| 263 | case DRM_CAP_CURSOR_WIDTH: | 265 | case DRM_CAP_CURSOR_WIDTH: |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 91ab7e9d6d2e..00eb4814b913 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -2268,7 +2268,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) | |||
| 2268 | page = shmem_read_mapping_page(mapping, i); | 2268 | page = shmem_read_mapping_page(mapping, i); |
| 2269 | if (IS_ERR(page)) { | 2269 | if (IS_ERR(page)) { |
| 2270 | ret = PTR_ERR(page); | 2270 | ret = PTR_ERR(page); |
| 2271 | goto err_pages; | 2271 | goto err_sg; |
| 2272 | } | 2272 | } |
| 2273 | } | 2273 | } |
| 2274 | #ifdef CONFIG_SWIOTLB | 2274 | #ifdef CONFIG_SWIOTLB |
| @@ -2311,8 +2311,9 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) | |||
| 2311 | 2311 | ||
| 2312 | return 0; | 2312 | return 0; |
| 2313 | 2313 | ||
| 2314 | err_pages: | 2314 | err_sg: |
| 2315 | sg_mark_end(sg); | 2315 | sg_mark_end(sg); |
| 2316 | err_pages: | ||
| 2316 | for_each_sgt_page(page, sgt_iter, st) | 2317 | for_each_sgt_page(page, sgt_iter, st) |
| 2317 | put_page(page); | 2318 | put_page(page); |
| 2318 | sg_free_table(st); | 2319 | sg_free_table(st); |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 81c11499bcf0..3cb70d73239b 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -12260,7 +12260,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | |||
| 12260 | intel_crtc->reset_count = i915_reset_count(&dev_priv->gpu_error); | 12260 | intel_crtc->reset_count = i915_reset_count(&dev_priv->gpu_error); |
| 12261 | if (i915_reset_in_progress_or_wedged(&dev_priv->gpu_error)) { | 12261 | if (i915_reset_in_progress_or_wedged(&dev_priv->gpu_error)) { |
| 12262 | ret = -EIO; | 12262 | ret = -EIO; |
| 12263 | goto cleanup; | 12263 | goto unlock; |
| 12264 | } | 12264 | } |
| 12265 | 12265 | ||
| 12266 | atomic_inc(&intel_crtc->unpin_work_count); | 12266 | atomic_inc(&intel_crtc->unpin_work_count); |
| @@ -12352,6 +12352,7 @@ cleanup_unpin: | |||
| 12352 | intel_unpin_fb_obj(fb, crtc->primary->state->rotation); | 12352 | intel_unpin_fb_obj(fb, crtc->primary->state->rotation); |
| 12353 | cleanup_pending: | 12353 | cleanup_pending: |
| 12354 | atomic_dec(&intel_crtc->unpin_work_count); | 12354 | atomic_dec(&intel_crtc->unpin_work_count); |
| 12355 | unlock: | ||
| 12355 | mutex_unlock(&dev->struct_mutex); | 12356 | mutex_unlock(&dev->struct_mutex); |
| 12356 | cleanup: | 12357 | cleanup: |
| 12357 | crtc->primary->fb = old_fb; | 12358 | crtc->primary->fb = old_fb; |
diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c index 4129b12521a6..0ae13cd2adda 100644 --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | |||
| @@ -479,7 +479,6 @@ static int radeon_atpx_power_state(enum vga_switcheroo_client_id id, | |||
| 479 | */ | 479 | */ |
| 480 | static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev) | 480 | static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev) |
| 481 | { | 481 | { |
| 482 | struct pci_dev *parent_pdev = pci_upstream_bridge(pdev); | ||
| 483 | acpi_handle dhandle, atpx_handle; | 482 | acpi_handle dhandle, atpx_handle; |
| 484 | acpi_status status; | 483 | acpi_status status; |
| 485 | 484 | ||
| @@ -493,7 +492,6 @@ static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev) | |||
| 493 | 492 | ||
| 494 | radeon_atpx_priv.dhandle = dhandle; | 493 | radeon_atpx_priv.dhandle = dhandle; |
| 495 | radeon_atpx_priv.atpx.handle = atpx_handle; | 494 | radeon_atpx_priv.atpx.handle = atpx_handle; |
| 496 | radeon_atpx_priv.bridge_pm_usable = parent_pdev && parent_pdev->bridge_d3; | ||
| 497 | return true; | 495 | return true; |
| 498 | } | 496 | } |
| 499 | 497 | ||
| @@ -555,11 +553,16 @@ static bool radeon_atpx_detect(void) | |||
| 555 | struct pci_dev *pdev = NULL; | 553 | struct pci_dev *pdev = NULL; |
| 556 | bool has_atpx = false; | 554 | bool has_atpx = false; |
| 557 | int vga_count = 0; | 555 | int vga_count = 0; |
| 556 | bool d3_supported = false; | ||
| 557 | struct pci_dev *parent_pdev; | ||
| 558 | 558 | ||
| 559 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { | 559 | while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { |
| 560 | vga_count++; | 560 | vga_count++; |
| 561 | 561 | ||
| 562 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); | 562 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); |
| 563 | |||
| 564 | parent_pdev = pci_upstream_bridge(pdev); | ||
| 565 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; | ||
| 563 | } | 566 | } |
| 564 | 567 | ||
| 565 | /* some newer PX laptops mark the dGPU as a non-VGA display device */ | 568 | /* some newer PX laptops mark the dGPU as a non-VGA display device */ |
| @@ -567,6 +570,9 @@ static bool radeon_atpx_detect(void) | |||
| 567 | vga_count++; | 570 | vga_count++; |
| 568 | 571 | ||
| 569 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); | 572 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); |
| 573 | |||
| 574 | parent_pdev = pci_upstream_bridge(pdev); | ||
| 575 | d3_supported |= parent_pdev && parent_pdev->bridge_d3; | ||
| 570 | } | 576 | } |
| 571 | 577 | ||
| 572 | if (has_atpx && vga_count == 2) { | 578 | if (has_atpx && vga_count == 2) { |
| @@ -574,6 +580,7 @@ static bool radeon_atpx_detect(void) | |||
| 574 | printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", | 580 | printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", |
| 575 | acpi_method_name); | 581 | acpi_method_name); |
| 576 | radeon_atpx_priv.atpx_detected = true; | 582 | radeon_atpx_priv.atpx_detected = true; |
| 583 | radeon_atpx_priv.bridge_pm_usable = d3_supported; | ||
| 577 | radeon_atpx_init(); | 584 | radeon_atpx_init(); |
| 578 | return true; | 585 | return true; |
| 579 | } | 586 | } |
