ATM the drm privacy-screen code is not using connector names to lookup drm privacy-screen providers, drm_privacy_screen_get() does support this, but before this change the con_id is set to NULL everywhere which is treated as a wildcard. There are some worries that we may see devices with 2 displays with a privacy-screen, be it 2 internal displays or 1 internal + 1 external. All laptop-models which currently are supported by the drm_privacy_screen code use an eDP display connected to eDP-1. This commits enables the use of the con_id parameter, hardcoding this to "eDP-1" in the lookup tables in drivers/gpu/drm/drm_privacy_screen_x86.c and adjusting the i915 driver to match. Using the con_id parameter paves the way for potentially having another display (attached to a different connector) which also has a builtin privacy-screen. This was tested by Hans de Goede on a ThinkPad and by Rajat Jain on an Intel Chromebook (both with builtin privacy-screens). Cc: Sean Paul <seanpaul@xxxxxxxxxxxx> Cc: Rajat Jain <rajatja@xxxxxxxxxx> Tested-by: Rajat Jain <rajatja@xxxxxxxxxx> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> --- drivers/gpu/drm/drm_privacy_screen_x86.c | 4 ++-- drivers/gpu/drm/i915/display/intel_ddi.c | 2 +- drivers/gpu/drm/i915/display/intel_display.c | 15 +++++++++++---- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/drm_privacy_screen_x86.c b/drivers/gpu/drm/drm_privacy_screen_x86.c index 72ed40e4997e..6afa3773313a 100644 --- a/drivers/gpu/drm/drm_privacy_screen_x86.c +++ b/drivers/gpu/drm/drm_privacy_screen_x86.c @@ -62,7 +62,7 @@ static const struct arch_init_data arch_init_data[] __initconst = { { .lookup = { .dev_id = NULL, - .con_id = NULL, + .con_id = "eDP-1", .provider = "privacy_screen-thinkpad_acpi", }, .detect = detect_thinkpad_privacy_screen, @@ -72,7 +72,7 @@ static const struct arch_init_data arch_init_data[] __initconst = { { .lookup = { .dev_id = NULL, - .con_id = NULL, + .con_id = "eDP-1", .provider = "privacy_screen-GOOG0010:00", }, .detect = detect_chromeos_privacy_screen, diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index cab505277595..e1930ab6ff11 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -3951,7 +3951,7 @@ intel_ddi_init_dp_connector(struct intel_digital_port *dig_port) struct drm_device *dev = dig_port->base.base.dev; struct drm_privacy_screen *privacy_screen; - privacy_screen = drm_privacy_screen_get(dev->dev, NULL); + privacy_screen = drm_privacy_screen_get(dev->dev, connector->base.name); if (!IS_ERR(privacy_screen)) { drm_connector_attach_privacy_screen_provider(&connector->base, privacy_screen); diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index fb455d3710c6..f0695c29a393 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -10825,7 +10825,11 @@ void intel_modeset_driver_remove_nogem(struct drm_i915_private *i915) bool intel_modeset_probe_defer(struct pci_dev *pdev) { + static const char * const internal_panel_connector_names[] = { + "eDP-1", + }; struct drm_privacy_screen *privacy_screen; + int i; /* * apple-gmux is needed on dual GPU MacBook Pro @@ -10835,11 +10839,14 @@ bool intel_modeset_probe_defer(struct pci_dev *pdev) return true; /* If the LCD panel has a privacy-screen, wait for it */ - privacy_screen = drm_privacy_screen_get(&pdev->dev, NULL); - if (IS_ERR(privacy_screen) && PTR_ERR(privacy_screen) == -EPROBE_DEFER) - return true; + for (i = 0; i < ARRAY_SIZE(internal_panel_connector_names); i++) { + privacy_screen = drm_privacy_screen_get(&pdev->dev, + internal_panel_connector_names[i]); + if (IS_ERR(privacy_screen) && PTR_ERR(privacy_screen) == -EPROBE_DEFER) + return true; - drm_privacy_screen_put(privacy_screen); + drm_privacy_screen_put(privacy_screen); + } return false; } -- 2.35.1