This patch does minor code reorganization. It introduces a helper function which creates device link from the non-VGA controller (consumer) to the VGA (supplier) and uses this helper function for creating device link from integrated HDA controller to VGA. It will help in subsequent patches which require a similar kind of device link from USB/Type-C USCI controller to VGA. Signed-off-by: Abhishek Sahu <abhsahu@xxxxxxxxxx> --- drivers/pci/quirks.c | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index a077f67fe1da..a20f7771a323 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -4916,36 +4916,50 @@ static void quirk_fsl_no_msi(struct pci_dev *pdev) DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID, quirk_fsl_no_msi); /* - * GPUs with integrated HDA controller for streaming audio to attached displays - * need a device link from the HDA controller (consumer) to the GPU (supplier) - * so that the GPU is powered up whenever the HDA controller is accessed. - * The GPU and HDA controller are functions 0 and 1 of the same PCI device. - * The device link stays in place until shutdown (or removal of the PCI device - * if it's hotplugged). Runtime PM is allowed by default on the HDA controller - * to prevent it from permanently keeping the GPU awake. + * GPUs can be multi-function PCI device which can contain controllers other + * than VGA (like Audio, USB, etc.). Internally in the hardware, these non-VGA + * controllers are tightly coupled with VGA controller. Whenever these + * controllers are runtime active, the VGA controller should also be in active + * state. Normally, in these GPUs, the VGA controller is present at function 0. + * + * This is a helper function which creates device link from the non-VGA + * controller (consumer) to the VGA (supplier). The device link stays in place + * until shutdown (or removal of the PCI device if it's hotplugged). + * Runtime PM is allowed by default on these non-VGA controllers to prevent + * it from permanently keeping the GPU awake. */ -static void quirk_gpu_hda(struct pci_dev *hda) +static void +pci_create_device_link_with_vga(struct pci_dev *pdev, unsigned int devfn) { struct pci_dev *gpu; - if (PCI_FUNC(hda->devfn) != 1) + if (PCI_FUNC(pdev->devfn) != devfn) return; - gpu = pci_get_domain_bus_and_slot(pci_domain_nr(hda->bus), - hda->bus->number, - PCI_DEVFN(PCI_SLOT(hda->devfn), 0)); + gpu = pci_get_domain_bus_and_slot(pci_domain_nr(pdev->bus), + pdev->bus->number, + PCI_DEVFN(PCI_SLOT(pdev->devfn), 0)); if (!gpu || (gpu->class >> 16) != PCI_BASE_CLASS_DISPLAY) { pci_dev_put(gpu); return; } - if (!device_link_add(&hda->dev, &gpu->dev, + if (!device_link_add(&pdev->dev, &gpu->dev, DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME)) - pci_err(hda, "cannot link HDA to GPU %s\n", pci_name(gpu)); + pci_err(pdev, "cannot link with VGA %s\n", pci_name(gpu)); - pm_runtime_allow(&hda->dev); + pm_runtime_allow(&pdev->dev); pci_dev_put(gpu); } + +/* + * Create device link for GPUs with integrated HDA controller for streaming + * audio to attached displays. + */ +static void quirk_gpu_hda(struct pci_dev *hda) +{ + pci_create_device_link_with_vga(hda, 1); +} DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_ATI, PCI_ANY_ID, PCI_CLASS_MULTIMEDIA_HD_AUDIO, 8, quirk_gpu_hda); DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_AMD, PCI_ANY_ID, -- 2.17.1