Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915/bios: gracefully disable dual eDP for now

For the time being, neither the power sequencer nor the backlight code
properly support two eDP panels simultaneously. While the software
states will be independent, the same sets of registers will be used for
both eDP panels, clobbering the hardware state and leading to errors.

Gracefully disable dual eDP until proper support has been added.

Cc: José Roberto de Souza <jose.souza@intel.com>
Cc: Uma Shankar <uma.shankar@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Swati Sharma <swati2.sharma@intel.com>
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
Acked-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Tested-by: Swati Sharma <swati2.sharma@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211005175636.24669-1-jani.nikula@intel.com

+47
+47
drivers/gpu/drm/i915/display/intel_bios.c
··· 1930 1930 } 1931 1931 } 1932 1932 1933 + static enum port get_edp_port(struct drm_i915_private *i915) 1934 + { 1935 + const struct intel_bios_encoder_data *devdata; 1936 + enum port port; 1937 + 1938 + for_each_port(port) { 1939 + devdata = i915->vbt.ports[port]; 1940 + 1941 + if (devdata && intel_bios_encoder_supports_edp(devdata)) 1942 + return port; 1943 + } 1944 + 1945 + return PORT_NONE; 1946 + } 1947 + 1948 + /* 1949 + * FIXME: The power sequencer and backlight code currently do not support more 1950 + * than one set registers, at least not on anything other than VLV/CHV. It will 1951 + * clobber the registers. As a temporary workaround, gracefully prevent more 1952 + * than one eDP from being registered. 1953 + */ 1954 + static void sanitize_dual_edp(struct intel_bios_encoder_data *devdata, 1955 + enum port port) 1956 + { 1957 + struct drm_i915_private *i915 = devdata->i915; 1958 + struct child_device_config *child = &devdata->child; 1959 + enum port p; 1960 + 1961 + /* CHV might not clobber PPS registers. */ 1962 + if (IS_CHERRYVIEW(i915)) 1963 + return; 1964 + 1965 + p = get_edp_port(i915); 1966 + if (p == PORT_NONE) 1967 + return; 1968 + 1969 + drm_dbg_kms(&i915->drm, "both ports %c and %c configured as eDP, " 1970 + "disabling port %c eDP\n", port_name(p), port_name(port), 1971 + port_name(port)); 1972 + 1973 + child->device_type &= ~DEVICE_TYPE_DISPLAYPORT_OUTPUT; 1974 + child->device_type &= ~DEVICE_TYPE_INTERNAL_CONNECTOR; 1975 + } 1976 + 1933 1977 static bool is_port_valid(struct drm_i915_private *i915, enum port port) 1934 1978 { 1935 1979 /* ··· 2030 1986 HAS_LSPCON(i915) && child->lspcon, 2031 1987 supports_typec_usb, supports_tbt, 2032 1988 devdata->dsc != NULL); 1989 + 1990 + if (is_edp) 1991 + sanitize_dual_edp(devdata, port); 2033 1992 2034 1993 if (is_dvi) 2035 1994 sanitize_ddc_pin(devdata, port);