Commit 0cb65c83 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 3c49de52 ab7cd8d8
...@@ -485,7 +485,6 @@ static int amdgpu_atpx_power_state(enum vga_switcheroo_client_id id, ...@@ -485,7 +485,6 @@ static int amdgpu_atpx_power_state(enum vga_switcheroo_client_id id,
*/ */
static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev) static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev)
{ {
struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
acpi_handle dhandle, atpx_handle; acpi_handle dhandle, atpx_handle;
acpi_status status; acpi_status status;
...@@ -500,7 +499,6 @@ static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev) ...@@ -500,7 +499,6 @@ static bool amdgpu_atpx_pci_probe_handle(struct pci_dev *pdev)
} }
amdgpu_atpx_priv.dhandle = dhandle; amdgpu_atpx_priv.dhandle = dhandle;
amdgpu_atpx_priv.atpx.handle = atpx_handle; amdgpu_atpx_priv.atpx.handle = atpx_handle;
amdgpu_atpx_priv.bridge_pm_usable = parent_pdev && parent_pdev->bridge_d3;
return true; return true;
} }
...@@ -562,17 +560,25 @@ static bool amdgpu_atpx_detect(void) ...@@ -562,17 +560,25 @@ static bool amdgpu_atpx_detect(void)
struct pci_dev *pdev = NULL; struct pci_dev *pdev = NULL;
bool has_atpx = false; bool has_atpx = false;
int vga_count = 0; int vga_count = 0;
bool d3_supported = false;
struct pci_dev *parent_pdev;
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
vga_count++; vga_count++;
has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true);
parent_pdev = pci_upstream_bridge(pdev);
d3_supported |= parent_pdev && parent_pdev->bridge_d3;
} }
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) {
vga_count++; vga_count++;
has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true);
parent_pdev = pci_upstream_bridge(pdev);
d3_supported |= parent_pdev && parent_pdev->bridge_d3;
} }
if (has_atpx && vga_count == 2) { if (has_atpx && vga_count == 2) {
...@@ -580,6 +586,7 @@ static bool amdgpu_atpx_detect(void) ...@@ -580,6 +586,7 @@ static bool amdgpu_atpx_detect(void)
printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n",
acpi_method_name); acpi_method_name);
amdgpu_atpx_priv.atpx_detected = true; amdgpu_atpx_priv.atpx_detected = true;
amdgpu_atpx_priv.bridge_pm_usable = d3_supported;
amdgpu_atpx_init(); amdgpu_atpx_init();
return true; return true;
} }
......
...@@ -2214,6 +2214,7 @@ uint32_t polaris10_get_mac_definition(uint32_t value) ...@@ -2214,6 +2214,7 @@ uint32_t polaris10_get_mac_definition(uint32_t value)
int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr) int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
{ {
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend); struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
uint32_t tmp; uint32_t tmp;
int result; int result;
bool error = false; bool error = false;
...@@ -2233,8 +2234,10 @@ int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr) ...@@ -2233,8 +2234,10 @@ int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
offsetof(SMU74_Firmware_Header, SoftRegisters), offsetof(SMU74_Firmware_Header, SoftRegisters),
&tmp, SMC_RAM_END); &tmp, SMC_RAM_END);
if (!result) if (!result) {
data->soft_regs_start = tmp;
smu_data->smu7_data.soft_regs_start = tmp; smu_data->smu7_data.soft_regs_start = tmp;
}
error |= (0 != result); error |= (0 != result);
......
...@@ -375,7 +375,6 @@ static int hdlcd_drm_bind(struct device *dev) ...@@ -375,7 +375,6 @@ static int hdlcd_drm_bind(struct device *dev)
err_fbdev: err_fbdev:
drm_kms_helper_poll_fini(drm); drm_kms_helper_poll_fini(drm);
drm_mode_config_cleanup(drm);
drm_vblank_cleanup(drm); drm_vblank_cleanup(drm);
err_vblank: err_vblank:
pm_runtime_disable(drm->dev); pm_runtime_disable(drm->dev);
...@@ -387,6 +386,7 @@ static int hdlcd_drm_bind(struct device *dev) ...@@ -387,6 +386,7 @@ static int hdlcd_drm_bind(struct device *dev)
drm_irq_uninstall(drm); drm_irq_uninstall(drm);
of_reserved_mem_device_release(drm->dev); of_reserved_mem_device_release(drm->dev);
err_free: err_free:
drm_mode_config_cleanup(drm);
dev_set_drvdata(dev, NULL); dev_set_drvdata(dev, NULL);
drm_dev_unref(drm); drm_dev_unref(drm);
......
...@@ -254,10 +254,12 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_ ...@@ -254,10 +254,12 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_
req->value = dev->mode_config.async_page_flip; req->value = dev->mode_config.async_page_flip;
break; break;
case DRM_CAP_PAGE_FLIP_TARGET: case DRM_CAP_PAGE_FLIP_TARGET:
req->value = 1; if (drm_core_check_feature(dev, DRIVER_MODESET)) {
drm_for_each_crtc(crtc, dev) { req->value = 1;
if (!crtc->funcs->page_flip_target) drm_for_each_crtc(crtc, dev) {
req->value = 0; if (!crtc->funcs->page_flip_target)
req->value = 0;
}
} }
break; break;
case DRM_CAP_CURSOR_WIDTH: case DRM_CAP_CURSOR_WIDTH:
......
...@@ -2268,7 +2268,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) ...@@ -2268,7 +2268,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
page = shmem_read_mapping_page(mapping, i); page = shmem_read_mapping_page(mapping, i);
if (IS_ERR(page)) { if (IS_ERR(page)) {
ret = PTR_ERR(page); ret = PTR_ERR(page);
goto err_pages; goto err_sg;
} }
} }
#ifdef CONFIG_SWIOTLB #ifdef CONFIG_SWIOTLB
...@@ -2311,8 +2311,9 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) ...@@ -2311,8 +2311,9 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
return 0; return 0;
err_pages: err_sg:
sg_mark_end(sg); sg_mark_end(sg);
err_pages:
for_each_sgt_page(page, sgt_iter, st) for_each_sgt_page(page, sgt_iter, st)
put_page(page); put_page(page);
sg_free_table(st); sg_free_table(st);
......
...@@ -12260,7 +12260,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, ...@@ -12260,7 +12260,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
intel_crtc->reset_count = i915_reset_count(&dev_priv->gpu_error); intel_crtc->reset_count = i915_reset_count(&dev_priv->gpu_error);
if (i915_reset_in_progress_or_wedged(&dev_priv->gpu_error)) { if (i915_reset_in_progress_or_wedged(&dev_priv->gpu_error)) {
ret = -EIO; ret = -EIO;
goto cleanup; goto unlock;
} }
atomic_inc(&intel_crtc->unpin_work_count); atomic_inc(&intel_crtc->unpin_work_count);
...@@ -12352,6 +12352,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, ...@@ -12352,6 +12352,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
intel_unpin_fb_obj(fb, crtc->primary->state->rotation); intel_unpin_fb_obj(fb, crtc->primary->state->rotation);
cleanup_pending: cleanup_pending:
atomic_dec(&intel_crtc->unpin_work_count); atomic_dec(&intel_crtc->unpin_work_count);
unlock:
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
cleanup: cleanup:
crtc->primary->fb = old_fb; crtc->primary->fb = old_fb;
......
...@@ -479,7 +479,6 @@ static int radeon_atpx_power_state(enum vga_switcheroo_client_id id, ...@@ -479,7 +479,6 @@ static int radeon_atpx_power_state(enum vga_switcheroo_client_id id,
*/ */
static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev) static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev)
{ {
struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
acpi_handle dhandle, atpx_handle; acpi_handle dhandle, atpx_handle;
acpi_status status; acpi_status status;
...@@ -493,7 +492,6 @@ static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev) ...@@ -493,7 +492,6 @@ static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev)
radeon_atpx_priv.dhandle = dhandle; radeon_atpx_priv.dhandle = dhandle;
radeon_atpx_priv.atpx.handle = atpx_handle; radeon_atpx_priv.atpx.handle = atpx_handle;
radeon_atpx_priv.bridge_pm_usable = parent_pdev && parent_pdev->bridge_d3;
return true; return true;
} }
...@@ -555,11 +553,16 @@ static bool radeon_atpx_detect(void) ...@@ -555,11 +553,16 @@ static bool radeon_atpx_detect(void)
struct pci_dev *pdev = NULL; struct pci_dev *pdev = NULL;
bool has_atpx = false; bool has_atpx = false;
int vga_count = 0; int vga_count = 0;
bool d3_supported = false;
struct pci_dev *parent_pdev;
while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
vga_count++; vga_count++;
has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true);
parent_pdev = pci_upstream_bridge(pdev);
d3_supported |= parent_pdev && parent_pdev->bridge_d3;
} }
/* some newer PX laptops mark the dGPU as a non-VGA display device */ /* some newer PX laptops mark the dGPU as a non-VGA display device */
...@@ -567,6 +570,9 @@ static bool radeon_atpx_detect(void) ...@@ -567,6 +570,9 @@ static bool radeon_atpx_detect(void)
vga_count++; vga_count++;
has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true);
parent_pdev = pci_upstream_bridge(pdev);
d3_supported |= parent_pdev && parent_pdev->bridge_d3;
} }
if (has_atpx && vga_count == 2) { if (has_atpx && vga_count == 2) {
...@@ -574,6 +580,7 @@ static bool radeon_atpx_detect(void) ...@@ -574,6 +580,7 @@ static bool radeon_atpx_detect(void)
printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n",
acpi_method_name); acpi_method_name);
radeon_atpx_priv.atpx_detected = true; radeon_atpx_priv.atpx_detected = true;
radeon_atpx_priv.bridge_pm_usable = d3_supported;
radeon_atpx_init(); radeon_atpx_init();
return true; return true;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment