How to handle disconnection of eDP panels due to dynamic display mux switches
Daniel Dadap
ddadap at nvidia.com
Thu Apr 2 17:56:04 UTC 2020
On 4/2/20 6:39 AM, Lukas Wunner wrote:
> External email: Use caution opening links or attachments
>
>
> On Fri, Mar 27, 2020 at 04:25:19PM -0500, Daniel Dadap wrote:
>> A number of hybrid GPU notebook computer designs with dual (integrated plus
>> discrete) GPUs are equipped with multiplexers (muxes) that allow display
>> panels to be driven by either the integrated GPU or the discrete GPU.
>> Typically, this is a selection that can be made at boot time as a menu
>> option in the system firmware's setup screen, and the mux selection stays
>> fixed for as long as the system is running and persists across reboots until
>> it is explicitly changed. However, some muxed hybrid GPU systems have
>> dynamically switchable muxes which can be switched while the system is
>> running.
> As you may be aware, there's drivers/gpu/vga/vga_switcheroo.c (of which
> I'm listed as a reviewer in MAINTAINERS) to support such hardware.
>
> It also supports muxed configurations, including those that support
> switching at runtime (and not only at boot) such as the MacBook Pro,
> which uses drivers/platform/x86/apple-gmux.c to interface between
> vga_switcheroo and the hardware mux.
>
> However, so far switching only actually works on LVDS-based MacBook Pros,
> i.e. all pre-retina machines introduced between Late 2008 and Mid 2012,
> because that hardware is capable of switching the DDC pins separately
> from the display, so we lock and switch them when probing the EDID.
I have observed that on at least some systems, the EDID for the internal
panel can be read via the ACPI _DDC method regardless of whether it's
actively muxed in. I don't know whether that's true for all systems
where the DDC line can't be switched independently, but maybe
vga_switcheroo could also export an interface for GPU drivers to cache
EDIDs so that a muxed-away GPU can read an EDID that was previously read
by another GPU? I guess the utility of that would depend on how
prevalent the combination of no DDC muxing + no ACPI EDID reads turns
out to be.
> The retina machines introduced from Mid 2012 onward use eDP and run
> into the issues you're describing: The AUX channel cannot be switched
> separately from the display, so link training fails unless the entire
> display is switched. Nevertheless macOS can switch the panel seamlessly.
> So how are they doing it?
>
> Well, I don't own a retina MacBook Pro, hence never got very far with
> supporting them, but I did some research and experiments in the 2015/2016
> time frame which a colleague, Bruno Bierbaumer, tested on his machine:
>
> First of all, there's DPCD byte 3 bit 6 (NO_AUX_HANDSHAKE_LINK_TRAINING)
> which is documented as follows:
>
> Does not require AUX CH handshake when the link configuration is
> already known. [...] The known-good drive current and pre-emphasis
> level (or those used in the last "full" link training with AUX CH
> handshake) must be used when the link training is performed without
> AUX CH handshake.
>
> That bit is set on the MacBook Pros in question.
I'll check one of the eDP-based systems I've been experimenting on to
see if setting the VGA_SWITCHER_NEEDS_EDP_CONFIG capability in the
handler is sufficient to make i915 avoid poking the AUX channel when
it's mux-switched away. (This would be in addition to hacking the
can_switch() callback in the GPU drivers to allow switching while there
are still active KMS clients for the purposes of this experiment, unless
somebody can point me to a tree with the WIP per-output switching Daniel
Vetter mentioned.
> So I think what we should be doing here is that the DRM driver which
> happens to be muxed to the panel on boot performs link training and
> informs vga_switcheroo of the drive current, pre-emph level, etc.
> The other DRM driver is notified when that information is available
> and uses it to set up its eDP output, skipping an actual AUX CH
> handshake.
>
> At least i915 probes various capabilities in the DPCD without any
> consideration that the AUX channel may currently not be available.
> Back in the day I experimented with a read-only proxy mechanism
> to make that work, whereby the inactive DRM driver uses the active
> DRM driver to access the DPCD:
>
> https://patchwork.kernel.org/patch/7000591/
>
> An alternative would be to have the active DRM driver cache the
> required portions of the DPCD for use by the inactive DRM driver.
>
> Note that vga_switcheroo is currently controlled via debugfs.
> That is a historic artefact. The kernel has since gained a
> mux subsystem in drivers/mux/ which could be used to represent
> the display mux in a standardized way in regular sysfs.
>
> Thanks,
>
> Lukas
More information about the dri-devel
mailing list