Fix Thunderbolt-related issues in apple-gmux and vga_switcheroo: Patch [1/5] ("Recognize Thunderbolt devices") has already been subjected to a fair amount of scrutiny over at linux-pci@, I've submitted it 5 times total since May 2016. With luck it may be in ack-able shape now. Patch [2/5] amends apple-gmux to handle combined DP/Thunderbolt ports properly on newer MacBook Pros. Patches [3/5] to [5/5] avoid registering external Thunderbolt GPUs with vga_switcheroo: Dave Airlie designed vga_switcheroo to register GPUs unconditionally. So if a desktop box has multiple GPUs, vga_switcheroo will see more than one discrete GPU but that's not a problem because on desktop boxes no handler is registered and thus vga_switcheroo_enable() is never called. Hybrid graphics laptops on the other hand do register a handler, but are assumed to never register more than one discrete GPU. However once a Thunderbolt eGPU is attached to a hybrid graphics laptop, that assumption is no longer true and things go south when vga_switcheroo runtime suspends the external discrete GPU and then calls the handler to cut power to the internal discrete GPU. The driver for the internal GPU will sit there puzzled and typically cause a lockup. This series is just a first step towards proper handling of eGPUs, another will be support for surprise removal: DRM drivers need to cease MMIO and PCI config space access once a device is gone to avoid delaying device teardown or accessing a newly attached replacement device. Also, MMIO reads to removed devices return "all ones", which results in an infinite loop e.g. in nouveau's nvkm_nsec(). The question is how to recognize device removal. One common method is to read the vendor register with pci_device_is_present(), but this reports a false positive if the device is present but in D3cold. A better method is to let the PCIe hotplug driver recognize and cache device removal. Keith Busch has developed patches which do exactly that, they're now at v6 and fully reviewed by Christoph Hellwig but alas were not included in the 4.11 PCI pull for some reason: http://www.spinics.net/lists/linux-pci/msg58123.html I've pushed the present series to GitHub in case anyone prefers reviewing it in a GUI: https://github.com/l1k/linux/commits/thunderbolt_gpu_v1 Thanks, Lukas Lukas Wunner (5): PCI: Recognize Thunderbolt devices apple-gmux: Don't switch external DP port on 2011+ MacBook Pros drm/nouveau: Don't register Thunderbolt eGPU with vga_switcheroo drm/radeon: Don't register Thunderbolt eGPU with vga_switcheroo drm/amdgpu: Don't register Thunderbolt eGPU with vga_switcheroo drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 7 +++++-- drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 3 ++- drivers/gpu/drm/nouveau/nouveau_vga.c | 10 +++++++++- drivers/gpu/drm/radeon/radeon_device.c | 7 +++++-- drivers/gpu/drm/radeon/radeon_kms.c | 3 ++- drivers/pci/pci.h | 2 ++ drivers/pci/probe.c | 21 ++++++++++++++++++++ drivers/platform/x86/apple-gmux.c | 31 +++++++++++++++++++++++++++++- include/linux/pci.h | 23 ++++++++++++++++++++++ 9 files changed, 99 insertions(+), 8 deletions(-) -- 2.11.0
Lukas Wunner
2017-Feb-24 19:19 UTC
[Nouveau] [PATCH 1/5] PCI: Recognize Thunderbolt devices
Detect on probe whether a PCI device is part of a Thunderbolt controller. Intel uses a Vendor-Specific Extended Capability (VSEC) with ID 0x1234 on such devices. Detect presence of this VSEC and cache it in a newly added is_thunderbolt bit in struct pci_dev. Add a helper to check whether a given PCI device is situated on a Thunderbolt daisy chain. The necessity arises from the following: * To power off Thunderbolt controllers on Macs even if their BIOS is older than 2015, their PCIe ports need to be whitelisted for runtime PM. For this we need a way to recognize them. * Dual GPU MacBook Pros introduced 2011+ can no longer switch external DisplayPort ports between GPUs. (They're no longer just used for DP but have become combined DP/Thunderbolt ports.) The driver to switch the ports, drivers/platform/x86/apple-gmux.c, needs to detect presence of a Thunderbolt controller and, if found, keep external ports permanently switched to the discrete GPU. * If an external Thunderbolt GPU is connected to a dual GPU laptop (Mac or not), that GPU is currently registered with vga_switcheroo even though it can neither drive the laptop's panel nor be powered off by the platform. To vga_switcheroo it will appear as if two discrete GPUs are present. As a result, when the external GPU is runtime suspended, vga_switcheroo will cut power to the internal discrete GPU which may not be runtime suspended at all at this moment. The solution is to not register external GPUs with vga_switcheroo, which necessitates a way to recognize if they're on a Thunderbolt daisy chain. Cc: Andreas Noever <andreas.noever at gmail.com> Cc: Michael Jamet <michael.jamet at intel.com> Cc: Tomas Winkler <tomas.winkler at intel.com> Cc: Amir Levy <amir.jer.levy at intel.com> Signed-off-by: Lukas Wunner <lukas at wunner.de> --- drivers/pci/pci.h | 2 ++ drivers/pci/probe.c | 21 +++++++++++++++++++++ include/linux/pci.h | 23 +++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index cb17db242f30..45c2b8144911 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -3,6 +3,8 @@ #define PCI_FIND_CAP_TTL 48 +#define PCI_VSEC_ID_INTEL_TBT 0x1234 /* Thunderbolt */ + extern const unsigned char pcie_link_speed[]; bool pcie_cap_has_lnkctl(const struct pci_dev *dev); diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 204960e70333..7963ecc6d85f 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -1208,6 +1208,24 @@ void set_pcie_hotplug_bridge(struct pci_dev *pdev) pdev->is_hotplug_bridge = 1; } +static void set_pcie_thunderbolt(struct pci_dev *dev) +{ + int vsec = 0; + u32 header; + + while ((vsec = pci_find_next_ext_capability(dev, vsec, + PCI_EXT_CAP_ID_VNDR))) { + pci_read_config_dword(dev, vsec + PCI_VNDR_HEADER, &header); + + /* Is the device part of a Thunderbolt controller? */ + if (dev->vendor == PCI_VENDOR_ID_INTEL && + PCI_VNDR_HEADER_ID(header) == PCI_VSEC_ID_INTEL_TBT) { + dev->is_thunderbolt = 1; + return; + } + } +} + /** * pci_ext_cfg_is_aliased - is ext config space just an alias of std config? * @dev: PCI device @@ -1360,6 +1378,9 @@ int pci_setup_device(struct pci_dev *dev) /* need to have dev->class ready */ dev->cfg_size = pci_cfg_space_size(dev); + /* need to have dev->cfg_size ready */ + set_pcie_thunderbolt(dev); + /* "Unknown power state" */ dev->current_state = PCI_UNKNOWN; diff --git a/include/linux/pci.h b/include/linux/pci.h index e2d1a124216a..36dfcfd946f4 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -358,6 +358,7 @@ struct pci_dev { unsigned int is_virtfn:1; unsigned int reset_fn:1; unsigned int is_hotplug_bridge:1; + unsigned int is_thunderbolt:1; /* Thunderbolt controller */ unsigned int __aer_firmware_first_valid:1; unsigned int __aer_firmware_first:1; unsigned int broken_intx_masking:1; @@ -2171,6 +2172,28 @@ static inline bool pci_ari_enabled(struct pci_bus *bus) return bus->self && bus->self->ari_enabled; } +/** + * pci_is_thunderbolt_attached - whether device is on a Thunderbolt daisy chain + * @pdev: PCI device to check + * + * Walk upwards from @pdev and check for each encountered bridge if it's + * part of a Thunderbolt controller. Reaching the host bridge means @pdev + * is soldered to the mainboard. + */ +static inline bool pci_is_thunderbolt_attached(struct pci_dev *pdev) +{ + struct pci_dev *parent = pdev; + + if (pdev->is_thunderbolt) + return true; + + while ((parent = pci_upstream_bridge(parent))) + if (parent->is_thunderbolt) + return true; + + return false; +} + /* provide the legacy pci_dma_* API */ #include <linux/pci-dma-compat.h> -- 2.11.0
Lukas Wunner
2017-Feb-24 19:19 UTC
[Nouveau] [PATCH 3/5] drm/nouveau: Don't register Thunderbolt eGPU with vga_switcheroo
An external Thunderbolt GPU can neither drive the laptop's panel nor be powered off by the platform, so there's no point in registering it with vga_switcheroo. In fact, when the external GPU is runtime suspended, vga_switcheroo will cut power to the internal discrete GPU, resulting in a lockup. Cc: Ben Skeggs <bskeggs at redhat.com> Signed-off-by: Lukas Wunner <lukas at wunner.de> --- drivers/gpu/drm/nouveau/nouveau_vga.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/nouveau/nouveau_vga.c b/drivers/gpu/drm/nouveau/nouveau_vga.c index eef22c6b9665..c2a7fd606c2e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_vga.c +++ b/drivers/gpu/drm/nouveau/nouveau_vga.c @@ -95,6 +95,10 @@ nouveau_vga_init(struct nouveau_drm *drm) vga_client_register(dev->pdev, dev, NULL, nouveau_vga_set_decode); + /* don't register Thunderbolt eGPU with vga_switcheroo */ + if (pci_is_thunderbolt_attached(dev->pdev)) + return; + if (nouveau_runtime_pm == 1) runtime = true; if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_is_v1_dsm())) @@ -111,6 +115,11 @@ nouveau_vga_fini(struct nouveau_drm *drm) struct drm_device *dev = drm->dev; bool runtime = false; + vga_client_register(dev->pdev, NULL, NULL, NULL); + + if (pci_is_thunderbolt_attached(dev->pdev)) + return; + if (nouveau_runtime_pm == 1) runtime = true; if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_is_v1_dsm())) @@ -119,7 +128,6 @@ nouveau_vga_fini(struct nouveau_drm *drm) vga_switcheroo_unregister_client(dev->pdev); if (runtime && nouveau_is_v1_dsm() && !nouveau_is_optimus()) vga_switcheroo_fini_domain_pm_ops(drm->dev->dev); - vga_client_register(dev->pdev, NULL, NULL, NULL); } -- 2.11.0
Bjorn Helgaas
2017-Feb-24 20:59 UTC
[Nouveau] [PATCH 3/5] drm/nouveau: Don't register Thunderbolt eGPU with vga_switcheroo
On Fri, Feb 24, 2017 at 1:19 PM, Lukas Wunner <lukas at wunner.de> wrote:> An external Thunderbolt GPU can neither drive the laptop's panel nor be > powered off by the platform, so there's no point in registering it with > vga_switcheroo.> In fact, when the external GPU is runtime suspended, > vga_switcheroo will cut power to the internal discrete GPU, resulting in > a lockup.Why does suspending the external GPU cause vga_switcheroo to cut power to the internal GPU? No doubt this would be obvious to a GPU person, which I definitely am not.> Cc: Ben Skeggs <bskeggs at redhat.com> > Signed-off-by: Lukas Wunner <lukas at wunner.de> > --- > drivers/gpu/drm/nouveau/nouveau_vga.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/nouveau/nouveau_vga.c b/drivers/gpu/drm/nouveau/nouveau_vga.c > index eef22c6b9665..c2a7fd606c2e 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_vga.c > +++ b/drivers/gpu/drm/nouveau/nouveau_vga.c > @@ -95,6 +95,10 @@ nouveau_vga_init(struct nouveau_drm *drm) > > vga_client_register(dev->pdev, dev, NULL, nouveau_vga_set_decode); > > + /* don't register Thunderbolt eGPU with vga_switcheroo */ > + if (pci_is_thunderbolt_attached(dev->pdev)) > + return;I guess there's no way to move this inside vga_switcheroo_register_client() instead of putting the test in all the drivers?> + > if (nouveau_runtime_pm == 1) > runtime = true; > if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_is_v1_dsm())) > @@ -111,6 +115,11 @@ nouveau_vga_fini(struct nouveau_drm *drm) > struct drm_device *dev = drm->dev; > bool runtime = false; > > + vga_client_register(dev->pdev, NULL, NULL, NULL); > + > + if (pci_is_thunderbolt_attached(dev->pdev)) > + return; > + > if (nouveau_runtime_pm == 1) > runtime = true; > if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_is_v1_dsm())) > @@ -119,7 +128,6 @@ nouveau_vga_fini(struct nouveau_drm *drm) > vga_switcheroo_unregister_client(dev->pdev); > if (runtime && nouveau_is_v1_dsm() && !nouveau_is_optimus()) > vga_switcheroo_fini_domain_pm_ops(drm->dev->dev); > - vga_client_register(dev->pdev, NULL, NULL, NULL);The amd & radeon patches look like this: - vga_switcheroo_unregister_client(rdev->pdev); + if (!pci_is_thunderbolt_attached(adev->pdev)) + vga_switcheroo_unregister_client(adev->pdev); This nouveau patch looks suspiciously different. But again, I'm not a GPU guy so all I can really say is "hmm, I wonder why it's different?"> } > > > -- > 2.11.0 >
Bjorn Helgaas
2017-Feb-24 22:17 UTC
[Nouveau] [PATCH 1/5] PCI: Recognize Thunderbolt devices
On Fri, Feb 24, 2017 at 08:19:45PM +0100, Lukas Wunner wrote:> Detect on probe whether a PCI device is part of a Thunderbolt controller. > > Intel uses a Vendor-Specific Extended Capability (VSEC) with ID 0x1234 > on such devices. Detect presence of this VSEC and cache it in a newly > added is_thunderbolt bit in struct pci_dev. Add a helper to check > whether a given PCI device is situated on a Thunderbolt daisy chain. > > The necessity arises from the following: > > * To power off Thunderbolt controllers on Macs even if their BIOS is > older than 2015, their PCIe ports need to be whitelisted for runtime > PM. For this we need a way to recognize them. > > * Dual GPU MacBook Pros introduced 2011+ can no longer switch external > DisplayPort ports between GPUs. (They're no longer just used for DP > but have become combined DP/Thunderbolt ports.) The driver to switch > the ports, drivers/platform/x86/apple-gmux.c, needs to detect presence > of a Thunderbolt controller and, if found, keep external ports > permanently switched to the discrete GPU. > > * If an external Thunderbolt GPU is connected to a dual GPU laptop (Mac > or not), that GPU is currently registered with vga_switcheroo even > though it can neither drive the laptop's panel nor be powered off by > the platform. To vga_switcheroo it will appear as if two discrete > GPUs are present. As a result, when the external GPU is runtime > suspended, vga_switcheroo will cut power to the internal discrete GPU > which may not be runtime suspended at all at this moment. The > solution is to not register external GPUs with vga_switcheroo, which > necessitates a way to recognize if they're on a Thunderbolt daisy > chain.If I understand correctly, vga_switcheroo manages two GPUs that have a single output: either there's a mux that connects one GPU or the other to the output, or one GPU is permanently connected to the output and the other does offline rendering. To this non-GPU person, it sounds like the important question is whether two GPUs are related in this way (either they feed the same mux, or there's some special offline rendering connection between them). That sounds unrelated to the question of how the GPUs themselves are connected to the PCI hierarchy.>From a pure PCI perspective, I assume it would be conceivable to havetwo Thunderbolt-connected GPUs feeding into a mux. Or to have a GPU (unrelated to the mux) in a non-Thunderbolt plugin slot or connected externally via a non-Thunderbolt switch and an iPass cable. If that's the case, and we're using Thunderbolt-connectedness as a hint that happens to work for the hardware we know about now, that's fine -- I'm just trying to understand what's a hint and what's intrisic to being connected via Thunderbolt.> Cc: Andreas Noever <andreas.noever at gmail.com> > Cc: Michael Jamet <michael.jamet at intel.com> > Cc: Tomas Winkler <tomas.winkler at intel.com> > Cc: Amir Levy <amir.jer.levy at intel.com> > Signed-off-by: Lukas Wunner <lukas at wunner.de> > --- > drivers/pci/pci.h | 2 ++ > drivers/pci/probe.c | 21 +++++++++++++++++++++ > include/linux/pci.h | 23 +++++++++++++++++++++++ > 3 files changed, 46 insertions(+) > > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h > index cb17db242f30..45c2b8144911 100644 > --- a/drivers/pci/pci.h > +++ b/drivers/pci/pci.h > @@ -3,6 +3,8 @@ > > #define PCI_FIND_CAP_TTL 48 > > +#define PCI_VSEC_ID_INTEL_TBT 0x1234 /* Thunderbolt */ > + > extern const unsigned char pcie_link_speed[]; > > bool pcie_cap_has_lnkctl(const struct pci_dev *dev); > diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c > index 204960e70333..7963ecc6d85f 100644 > --- a/drivers/pci/probe.c > +++ b/drivers/pci/probe.c > @@ -1208,6 +1208,24 @@ void set_pcie_hotplug_bridge(struct pci_dev *pdev) > pdev->is_hotplug_bridge = 1; > } > > +static void set_pcie_thunderbolt(struct pci_dev *dev) > +{ > + int vsec = 0; > + u32 header; > + > + while ((vsec = pci_find_next_ext_capability(dev, vsec, > + PCI_EXT_CAP_ID_VNDR))) { > + pci_read_config_dword(dev, vsec + PCI_VNDR_HEADER, &header); > + > + /* Is the device part of a Thunderbolt controller? */ > + if (dev->vendor == PCI_VENDOR_ID_INTEL && > + PCI_VNDR_HEADER_ID(header) == PCI_VSEC_ID_INTEL_TBT) { > + dev->is_thunderbolt = 1; > + return; > + } > + } > +} > + > /** > * pci_ext_cfg_is_aliased - is ext config space just an alias of std config? > * @dev: PCI device > @@ -1360,6 +1378,9 @@ int pci_setup_device(struct pci_dev *dev) > /* need to have dev->class ready */ > dev->cfg_size = pci_cfg_space_size(dev); > > + /* need to have dev->cfg_size ready */ > + set_pcie_thunderbolt(dev); > + > /* "Unknown power state" */ > dev->current_state = PCI_UNKNOWN; > > diff --git a/include/linux/pci.h b/include/linux/pci.h > index e2d1a124216a..36dfcfd946f4 100644 > --- a/include/linux/pci.h > +++ b/include/linux/pci.h > @@ -358,6 +358,7 @@ struct pci_dev { > unsigned int is_virtfn:1; > unsigned int reset_fn:1; > unsigned int is_hotplug_bridge:1; > + unsigned int is_thunderbolt:1; /* Thunderbolt controller */I'm not really keen on having this in the PCI core because the core doesn't need this or even know what it means. pci_find_next_ext_capability() is available to drivers, and if Thunderbolt-connectedness is useful information to apple-gmux or GPU drivers, it's fine with me if you want to use it there. I just don't see the benefit to having it in the core.> unsigned int __aer_firmware_first_valid:1; > unsigned int __aer_firmware_first:1; > unsigned int broken_intx_masking:1; > @@ -2171,6 +2172,28 @@ static inline bool pci_ari_enabled(struct pci_bus *bus) > return bus->self && bus->self->ari_enabled; > } > > +/** > + * pci_is_thunderbolt_attached - whether device is on a Thunderbolt daisy chain > + * @pdev: PCI device to check > + * > + * Walk upwards from @pdev and check for each encountered bridge if it's > + * part of a Thunderbolt controller. Reaching the host bridge means @pdev > + * is soldered to the mainboard.The comment suggests this returns false only if @pdev is soldered to the mainboard. I don't think that's the case. This will return true for a Thunderbolt controller and all devices downstream from it. It will return false for all others, whether they're soldered down or not.> + */ > +static inline bool pci_is_thunderbolt_attached(struct pci_dev *pdev) > +{ > + struct pci_dev *parent = pdev; > + > + if (pdev->is_thunderbolt) > + return true; > + > + while ((parent = pci_upstream_bridge(parent))) > + if (parent->is_thunderbolt) > + return true; > + > + return false; > +} > + > /* provide the legacy pci_dma_* API */ > #include <linux/pci-dma-compat.h> > > -- > 2.11.0 >
On Fri, Feb 24, 2017 at 08:19:45PM +0100, Lukas Wunner wrote:> Fix Thunderbolt-related issues in apple-gmux and vga_switcheroo: > > Patch [1/5] ("Recognize Thunderbolt devices") has already been subjected > to a fair amount of scrutiny over at linux-pci@, I've submitted it 5 times > total since May 2016. With luck it may be in ack-able shape now. > > Patch [2/5] amends apple-gmux to handle combined DP/Thunderbolt ports > properly on newer MacBook Pros. > > Patches [3/5] to [5/5] avoid registering external Thunderbolt GPUs with > vga_switcheroo: Dave Airlie designed vga_switcheroo to register GPUs > unconditionally. So if a desktop box has multiple GPUs, vga_switcheroo > will see more than one discrete GPU but that's not a problem because on > desktop boxes no handler is registered and thus vga_switcheroo_enable() > is never called. Hybrid graphics laptops on the other hand do register > a handler, but are assumed to never register more than one discrete GPU. > However once a Thunderbolt eGPU is attached to a hybrid graphics laptop, > that assumption is no longer true and things go south when vga_switcheroo > runtime suspends the external discrete GPU and then calls the handler to > cut power to the internal discrete GPU. The driver for the internal GPU > will sit there puzzled and typically cause a lockup. > > This series is just a first step towards proper handling of eGPUs, another > will be support for surprise removal: DRM drivers need to cease MMIO and > PCI config space access once a device is gone to avoid delaying device > teardown or accessing a newly attached replacement device. Also, MMIO > reads to removed devices return "all ones", which results in an infinite > loop e.g. in nouveau's nvkm_nsec(). > > The question is how to recognize device removal. One common method is to > read the vendor register with pci_device_is_present(), but this reports > a false positive if the device is present but in D3cold. A better method > is to let the PCIe hotplug driver recognize and cache device removal. > Keith Busch has developed patches which do exactly that, they're now at > v6 and fully reviewed by Christoph Hellwig but alas were not included in > the 4.11 PCI pull for some reason: > http://www.spinics.net/lists/linux-pci/msg58123.html > > I've pushed the present series to GitHub in case anyone prefers reviewing > it in a GUI: > https://github.com/l1k/linux/commits/thunderbolt_gpu_v1For merging, should I smash this all into drm-misc? The only thing outside is the apple-gmux driver ... -Daniel> > Thanks, > > Lukas > > > Lukas Wunner (5): > PCI: Recognize Thunderbolt devices > apple-gmux: Don't switch external DP port on 2011+ MacBook Pros > drm/nouveau: Don't register Thunderbolt eGPU with vga_switcheroo > drm/radeon: Don't register Thunderbolt eGPU with vga_switcheroo > drm/amdgpu: Don't register Thunderbolt eGPU with vga_switcheroo > > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 7 +++++-- > drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 3 ++- > drivers/gpu/drm/nouveau/nouveau_vga.c | 10 +++++++++- > drivers/gpu/drm/radeon/radeon_device.c | 7 +++++-- > drivers/gpu/drm/radeon/radeon_kms.c | 3 ++- > drivers/pci/pci.h | 2 ++ > drivers/pci/probe.c | 21 ++++++++++++++++++++ > drivers/platform/x86/apple-gmux.c | 31 +++++++++++++++++++++++++++++- > include/linux/pci.h | 23 ++++++++++++++++++++++ > 9 files changed, 99 insertions(+), 8 deletions(-) > > -- > 2.11.0 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel-- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch
On Thu, Mar 09, 2017 at 04:03:47PM +0100, Daniel Vetter wrote:> On Fri, Feb 24, 2017 at 08:19:45PM +0100, Lukas Wunner wrote: > > Fix Thunderbolt-related issues in apple-gmux and vga_switcheroo: > > > > Patch [1/5] ("Recognize Thunderbolt devices") has already been subjected > > to a fair amount of scrutiny over at linux-pci@, I've submitted it 5 times > > total since May 2016. With luck it may be in ack-able shape now. > > > > Patch [2/5] amends apple-gmux to handle combined DP/Thunderbolt ports > > properly on newer MacBook Pros. > > > > Patches [3/5] to [5/5] avoid registering external Thunderbolt GPUs with > > vga_switcheroo: Dave Airlie designed vga_switcheroo to register GPUs > > unconditionally. So if a desktop box has multiple GPUs, vga_switcheroo > > will see more than one discrete GPU but that's not a problem because on > > desktop boxes no handler is registered and thus vga_switcheroo_enable() > > is never called. Hybrid graphics laptops on the other hand do register > > a handler, but are assumed to never register more than one discrete GPU. > > However once a Thunderbolt eGPU is attached to a hybrid graphics laptop, > > that assumption is no longer true and things go south when vga_switcheroo > > runtime suspends the external discrete GPU and then calls the handler to > > cut power to the internal discrete GPU. The driver for the internal GPU > > will sit there puzzled and typically cause a lockup.[snip]> > I've pushed the present series to GitHub in case anyone prefers reviewing > > it in a GUI: > > https://github.com/l1k/linux/commits/thunderbolt_gpu_v1 > > For merging, should I smash this all into drm-misc? The only thing outside > is the apple-gmux driver ...Merging through drm-misc would be lovely. However I've prepared a v2 of patch [1/5] to address Bjorn's comments (amended the commit message and a code comment). I'll respin the series this evening and include the acks I've collected so far. @Darren & Andy: Please ack patch [5/5] of this series, barring any objections. I'll move the apple-gmux patch to the end of the series, so merging that one can be postponed until Darren and Andy find the time to look at it. Thanks! Lukas
Apparently Analagous Threads
- [PATCH v3 0/7] Improvements to pcie_bandwidth_available() for eGPUs
- [PATCH 1/5] PCI: Recognize Thunderbolt devices
- [PATCH 3/5] drm/nouveau: Don't register Thunderbolt eGPU with vga_switcheroo
- [PATCH 0/5] Thunderbolt GPU fixes
- [PATCH 09/15] drm/nouveau: Remove references to struct drm_device.pdev