[Nouveau] [PATCH 1/4] drm: retrieve EDID via ACPI _DDC method
Daniel Dadap
ddadap at nvidia.com
Wed Aug 12 22:37:37 UTC 2020
Thanks, Lukas. I've incorporated your feedback into my local tree, but
will wait for additional feedback from the individual DRM driver
maintainers before sending out a series v2.
On 8/8/20 5:11 PM, Lukas Wunner wrote:
> On Mon, Jul 27, 2020 at 03:53:54PM -0500, Daniel Dadap wrote:
>> + for (i = 0; i < num_dod_entries; i++) {
>> + if (adr == dod_entries[i]) {
>> + ret = do_acpi_ddc(child->handle);
>> +
>> + if (ret != NULL)
>> + goto done;
> I guess ideally we'd want to correlate the display objects with
> drm_connectors or at least constrain the search to Display Type
> "Internal/Integrated Digital Flat Panel" instead of picking the
> first EDID found. Otherwise we might erroneously use the DDC
> for an externally attached display.
Yes, we'd definitely need a way to do this if this functionality ever
needs to be extended to systems with more than one _DDC method.
Unfortunately, this will be much easier said than done, since I'm not
aware of any way to reliably do map _DOD entries to connectors in a GPU
driver, especially when we're talking about possibly correlating
connectors on multiple GPUs which mux to the same internal display or
external connector. All systems which I am aware of that implement ACPI
_DDC do so for a single internal panel. I don't believe there's any
reason to ever retrieve an EDID via ACPI _DDC for an external panel, but
a hypothetical design with multiple internal panels, more than one of
which needs to retrieve an EDID via ACPI _DDC, would certainly be
problematic.
On at least the system I'm working with for the various switcheroo and
platform-x86 driver patches I've recently sent off, the dGPU has an ACPI
_DOD table and one _DDC method corresponding to one of the _DOD entries,
but the iGPU has neither a _DOD table nor a _DDC method. Either GPU can
be connected to the internal panel via the dynamically switchable mux,
and the internal panel's EDID is available via _DDC to allow a
disconnected GPU to read the EDID. Since only the DGPU has _DOD and
_DDC, and there's no obvious way to associate connectors on the iGPU
with connectors on the dGPU, I've implemented the ACPI _DDC EDID
retrieval with the "first available" implementation you see here. I'm
open to other ideas if you have them, but didn't see a good way to
search for the "right" _DDC implementation should there be more than one.
As for preventing the ACPI EDID retrieval from being used for external
panels, I've done this in the individual DRM drivers that call into the
new drm_edid_acpi() API since it seemed that each DRM driver had its own
way of distinguishing display connector types. If there's a good way to
filter for internal panels in DRM core, I'd be happy to do that instead.
More information about the Nouveau
mailing list