/* * Laptops with Intel GPUs which have panels that support controlling the * backlight through DP AUX can actually use two different interfaces: Intel's * proprietary DP AUX backlight interface, and the standard VESA backlight * interface. Unfortunately, at the time of writing this a lot of laptops will * advertise support for the standard VESA backlight interface when they * don't properly support it. However, on these systems the Intel backlight * interface generally does work properly. Additionally, these systems will * usually just indicate that they use PWM backlight controls in their VBIOS * for some reason.
*/
/* * DP AUX registers for Intel's proprietary HDR backlight interface. We define * them here since we'll likely be the only driver to ever use these.
*/ #define INTEL_EDP_HDR_TCON_CAP0 0x340
if (!(tcon_cap[1] & INTEL_EDP_HDR_TCON_BRIGHTNESS_NITS_CAP)) returnfalse;
/* * If we don't have HDR static metadata there is no way to * runtime detect used range for nits based control. For now * do not use Intel proprietary eDP backlight control if we * don't have this data in panel EDID. In case we find panel * which supports only nits based control, but doesn't provide * HDR static metadata we need to start maintaining table of * ranges for such panels.
*/ if (display->params.enable_dpcd_backlight != INTEL_DP_AUX_BACKLIGHT_FORCE_INTEL &&
!(connector->base.display_info.hdr_sink_metadata.hdmi_type1.metadata_type &
BIT(HDMI_STATIC_METADATA_TYPE1))) {
drm_info(display->drm, "[CONNECTOR:%d:%s] Panel is missing HDR static metadata. Possible support for Intel HDR backlight interface is not used. If your backlight controls don't work try booting with i915.enable_dpcd_backlight=%d.\n",
connector->base.base.id, connector->base.name,
INTEL_DP_AUX_BACKLIGHT_FORCE_INTEL); returnfalse;
}
/* * According to spec segmented backlight needs to be set whenever panel is in * HDR mode.
*/ if (intel_dp_in_hdr_mode(conn_state)) {
*ctrl |= INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE;
*ctrl |= INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE;
}
if (DISPLAY_VER(display) < 11)
*ctrl &= ~INTEL_EDP_HDR_TCON_TONE_MAPPING_ENABLE;
ret = drm_dp_dpcd_readb(&intel_dp->aux, INTEL_EDP_HDR_GETSET_CTRL_PARAMS, &old_ctrl); if (ret != 1) {
drm_err(display->drm, "[CONNECTOR:%d:%s] Failed to read current backlight control mode: %d\n",
connector->base.base.id, connector->base.name, ret); return;
}
/* Nothing to do for AUX based backlight controls */ if (panel->backlight.edp.intel_cap.sdr_uses_aux) return;
/* Note we want the actual pwm_level to be 0, regardless of pwm_min */
panel->backlight.pwm_funcs->disable(conn_state, intel_backlight_invert_pwm_level(connector, 0));
}
drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] Using AUX HDR interface for backlight control (range %d..%d)\n",
connector->base.base.id, connector->base.name,
panel->backlight.min, panel->backlight.max);
ret = drm_edp_backlight_init(&intel_dp->aux, &panel->backlight.edp.vesa.info,
luminance_range->max_luminance,
panel->vbt.backlight.pwm_freq_hz,
intel_dp->edp_dpcd, ¤t_level, ¤t_mode,
panel->backlight.edp.vesa.luminance_control_support); if (ret < 0) return ret;
drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] AUX VESA backlight enable is controlled through %s\n",
connector->base.base.id, connector->base.name,
dpcd_vs_pwm_str(panel->backlight.edp.vesa.info.aux_enable));
drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] AUX VESA backlight level is controlled through %s\n",
connector->base.base.id, connector->base.name,
dpcd_vs_pwm_str(panel->backlight.edp.vesa.info.aux_set));
if (!panel->backlight.edp.vesa.info.aux_set ||
!panel->backlight.edp.vesa.info.aux_enable) {
ret = panel->backlight.pwm_funcs->setup(connector, pipe); if (ret < 0) {
drm_err(display->drm, "[CONNECTOR:%d:%s] Failed to setup PWM backlight controls for eDP backlight: %d\n",
connector->base.base.id, connector->base.name, ret); return ret;
}
}
if ((intel_dp->edp_dpcd[3] & DP_EDP_PANEL_LUMINANCE_CONTROL_CAPABLE) &&
(intel_dp->edp_dpcd[3] & DP_EDP_SMOOTH_BRIGHTNESS_CAPABLE)) {
drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] AUX Luminance Based Backlight Control Supported!\n",
connector->base.base.id, connector->base.name);
panel->backlight.edp.vesa.luminance_control_support = true; returntrue;
}
if (drm_edp_backlight_supported(intel_dp->edp_dpcd)) {
drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] AUX Backlight Control Supported!\n",
connector->base.base.id, connector->base.name); returntrue;
} returnfalse;
}
/* Check the VBT and user's module parameters to figure out which * interfaces to probe
*/ switch (display->params.enable_dpcd_backlight) { case INTEL_DP_AUX_BACKLIGHT_OFF: return -ENODEV; case INTEL_DP_AUX_BACKLIGHT_AUTO: switch (panel->vbt.backlight.type) { case INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE:
try_vesa_interface = true; break; case INTEL_BACKLIGHT_DISPLAY_DDI:
try_intel_interface = true; break; default: return -ENODEV;
} break; case INTEL_DP_AUX_BACKLIGHT_ON: if (panel->vbt.backlight.type != INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE)
try_intel_interface = true;
try_vesa_interface = true; break; case INTEL_DP_AUX_BACKLIGHT_FORCE_VESA:
try_vesa_interface = true; break; case INTEL_DP_AUX_BACKLIGHT_FORCE_INTEL:
try_intel_interface = true; break;
}
/* For eDP 1.5 and above we are supposed to use VESA interface for brightness control */ if (intel_dp->edp_dpcd[0] >= DP_EDP_15)
try_vesa_interface = true;
/* * Since Intel has their own backlight control interface, the majority of machines out there * using DPCD backlight controls with Intel GPUs will be using this interface as opposed to * the VESA interface. However, other GPUs (such as Nvidia's) will always use the VESA * interface. This means that there's quite a number of panels out there that will advertise * support for both interfaces, primarily systems with Intel/Nvidia hybrid GPU setups. * * There's a catch to this though: on many panels that advertise support for both * interfaces, the VESA backlight interface will stop working once we've programmed the * panel with Intel's OUI - which is also required for us to be able to detect Intel's * backlight interface at all. This means that the only sensible way for us to detect both * interfaces is to probe for Intel's first, and VESA's second.
*/ if (try_intel_interface && intel_dp_aux_supports_hdr_backlight(connector) &&
intel_dp->edp_dpcd[0] <= DP_EDP_14b) {
drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Using Intel proprietary eDP backlight controls\n",
connector->base.base.id, connector->base.name);
panel->backlight.funcs = &intel_dp_hdr_bl_funcs; return 0;
}
if (try_vesa_interface && intel_dp_aux_supports_vesa_backlight(connector)) {
drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Using VESA eDP backlight controls\n",
connector->base.base.id, connector->base.name);
panel->backlight.funcs = &intel_dp_vesa_bl_funcs; return 0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.