drm/nouveau: Runtime suspend despite HDA being unbound
Commit 5addcf0a5f
("nouveau: add runtime PM support (v0.9)") prevents
runtime suspend of the GPU if its integrated HDA controller is not bound
to a driver. The rationale appears to be that probing the HDA fails if
the GPU is in D3cold.
However we now use a device link to ensure that the GPU is runtime
resumed while the HDA controller is probed, rendering this safety
measure obsolete. Remove it.
Cc: Dave Airlie <airlied@redhat.com>
Cc: Ben Skeggs <bskeggs@redhat.com>
Cc: Takashi Iwai <tiwai@suse.de>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Tested-by: Denis Lisov <dennis.lissov@gmail.com> # Nvidia Optimus
Tested-by: Peter Wu <peter@lekensteyn.nl> # Nvidia Optimus
Tested-by: Lukas Wunner <lukas@wunner.de> # MacBook Pro
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Link: https://patchwork.freedesktop.org/patch/msgid/77e0ab74f3377ea9b6acf8fab624acfb4f7dbeca.1520068884.git.lukas@wunner.de
This commit is contained in:
@@ -510,37 +510,6 @@ static int nouveau_drm_probe(struct pci_dev *pdev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403
|
|
||||||
|
|
||||||
static void
|
|
||||||
nouveau_get_hdmi_dev(struct nouveau_drm *drm)
|
|
||||||
{
|
|
||||||
struct pci_dev *pdev = drm->dev->pdev;
|
|
||||||
|
|
||||||
if (!pdev) {
|
|
||||||
NV_DEBUG(drm, "not a PCI device; no HDMI\n");
|
|
||||||
drm->hdmi_device = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* subfunction one is a hdmi audio device? */
|
|
||||||
drm->hdmi_device = pci_get_domain_bus_and_slot(pci_domain_nr(pdev->bus),
|
|
||||||
(unsigned int)pdev->bus->number,
|
|
||||||
PCI_DEVFN(PCI_SLOT(pdev->devfn), 1));
|
|
||||||
|
|
||||||
if (!drm->hdmi_device) {
|
|
||||||
NV_DEBUG(drm, "hdmi device not found %d %d %d\n", pdev->bus->number, PCI_SLOT(pdev->devfn), 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((drm->hdmi_device->class >> 8) != PCI_CLASS_MULTIMEDIA_HD_AUDIO) {
|
|
||||||
NV_DEBUG(drm, "possible hdmi device not audio %d\n", drm->hdmi_device->class);
|
|
||||||
pci_dev_put(drm->hdmi_device);
|
|
||||||
drm->hdmi_device = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
nouveau_drm_load(struct drm_device *dev, unsigned long flags)
|
nouveau_drm_load(struct drm_device *dev, unsigned long flags)
|
||||||
{
|
{
|
||||||
@@ -568,8 +537,6 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
|
|||||||
INIT_LIST_HEAD(&drm->clients);
|
INIT_LIST_HEAD(&drm->clients);
|
||||||
spin_lock_init(&drm->tile.lock);
|
spin_lock_init(&drm->tile.lock);
|
||||||
|
|
||||||
nouveau_get_hdmi_dev(drm);
|
|
||||||
|
|
||||||
/* workaround an odd issue on nvc1 by disabling the device's
|
/* workaround an odd issue on nvc1 by disabling the device's
|
||||||
* nosnoop capability. hopefully won't cause issues until a
|
* nosnoop capability. hopefully won't cause issues until a
|
||||||
* better fix is found - assuming there is one...
|
* better fix is found - assuming there is one...
|
||||||
@@ -655,8 +622,6 @@ nouveau_drm_unload(struct drm_device *dev)
|
|||||||
nouveau_ttm_fini(drm);
|
nouveau_ttm_fini(drm);
|
||||||
nouveau_vga_fini(drm);
|
nouveau_vga_fini(drm);
|
||||||
|
|
||||||
if (drm->hdmi_device)
|
|
||||||
pci_dev_put(drm->hdmi_device);
|
|
||||||
nouveau_cli_fini(&drm->client);
|
nouveau_cli_fini(&drm->client);
|
||||||
nouveau_cli_fini(&drm->master);
|
nouveau_cli_fini(&drm->master);
|
||||||
kfree(drm);
|
kfree(drm);
|
||||||
@@ -911,15 +876,6 @@ nouveau_pmops_runtime_idle(struct device *dev)
|
|||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we have a hdmi audio device - make sure it has a driver loaded */
|
|
||||||
if (drm->hdmi_device) {
|
|
||||||
if (!drm->hdmi_device->driver) {
|
|
||||||
DRM_DEBUG_DRIVER("failing to power off - no HDMI audio driver loaded\n");
|
|
||||||
pm_runtime_mark_last_busy(dev);
|
|
||||||
return -EBUSY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
list_for_each_entry(crtc, &drm->dev->mode_config.crtc_list, head) {
|
list_for_each_entry(crtc, &drm->dev->mode_config.crtc_list, head) {
|
||||||
if (crtc->enabled) {
|
if (crtc->enabled) {
|
||||||
DRM_DEBUG_DRIVER("failing to power off - crtc active\n");
|
DRM_DEBUG_DRIVER("failing to power off - crtc active\n");
|
||||||
|
@@ -208,7 +208,6 @@ struct nouveau_drm {
|
|||||||
bool have_disp_power_ref;
|
bool have_disp_power_ref;
|
||||||
|
|
||||||
struct dev_pm_domain vga_pm_domain;
|
struct dev_pm_domain vga_pm_domain;
|
||||||
struct pci_dev *hdmi_device;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct nouveau_drm *
|
static inline struct nouveau_drm *
|
||||||
|
Reference in New Issue
Block a user