mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'drm-intel-next-2025-12-19' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-next
Beyond Display related: - Switch to use kernel standard fault injection in i915 (Juha-Pekka) Display uAPI related: - Display uapi vs. hw state fixes (Ville) - Expose sharpness only if num_scalers is >= 2 (Nemesa) Display related: - More display driver refactor and clean-ups, specially towards separation (Jani) - Add initial support Xe3p_LPD for NVL (Gustavo, Sai, ) - BMG FBC W/a (Vinod) - RPM fix (Dibin) - Add MTL+ platforms to support dpll framework (Mika, Imre) - Other PLL related fixes (Imre) - Fix DIMM_S DRAM decoding on ICL (Ville) - Async flip refactor (Ville, Jouni) - Go back to using AUX interrupts (Ville) - Reduce severity of failed DII FEC enabling (Grzelak) - Enable system cache support for FBC (Vinod) - Move PSR/Panel Replay sink data into intel_connector and other PSR changes (Jouni) - Detect AuxCCS support via display parent interface (Tvrtko) - Clean up link BW/DSC slice config computation(Imre) - Toggle powerdown states for C10 on HDMI (Gustavo) - Add parent interface for PC8 forcewake tricks (Ville) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patch.msgid.link/aUW3bVDdE63aSFOJ@intel.com
This commit is contained in:
@@ -2704,6 +2704,71 @@ u8 drm_dp_dsc_sink_bpp_incr(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dp_dsc_sink_bpp_incr);
|
||||
|
||||
/**
|
||||
* drm_dp_dsc_slice_count_to_mask() - Convert a slice count to a slice count mask
|
||||
* @slice_count: slice count
|
||||
*
|
||||
* Convert @slice_count to a slice count mask.
|
||||
*
|
||||
* Returns the slice count mask.
|
||||
*/
|
||||
u32 drm_dp_dsc_slice_count_to_mask(int slice_count)
|
||||
{
|
||||
return BIT(slice_count - 1);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dp_dsc_slice_count_to_mask);
|
||||
|
||||
/**
|
||||
* drm_dp_dsc_sink_slice_count_mask() - Get the mask of valid DSC sink slice counts
|
||||
* @dsc_dpcd: the sink's DSC DPCD capabilities
|
||||
* @is_edp: %true for an eDP sink
|
||||
*
|
||||
* Get the mask of supported slice counts from the sink's DSC DPCD register.
|
||||
*
|
||||
* Returns:
|
||||
* Mask of slice counts supported by the DSC sink:
|
||||
* - > 0: bit#0,1,3,5..,23 set if the sink supports 1,2,4,6..,24 slices
|
||||
* - 0: if the sink doesn't support any slices
|
||||
*/
|
||||
u32 drm_dp_dsc_sink_slice_count_mask(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE],
|
||||
bool is_edp)
|
||||
{
|
||||
u8 slice_cap1 = dsc_dpcd[DP_DSC_SLICE_CAP_1 - DP_DSC_SUPPORT];
|
||||
u32 mask = 0;
|
||||
|
||||
if (!is_edp) {
|
||||
/* For DP, use values from DSC_SLICE_CAP_1 and DSC_SLICE_CAP2 */
|
||||
u8 slice_cap2 = dsc_dpcd[DP_DSC_SLICE_CAP_2 - DP_DSC_SUPPORT];
|
||||
|
||||
if (slice_cap2 & DP_DSC_24_PER_DP_DSC_SINK)
|
||||
mask |= drm_dp_dsc_slice_count_to_mask(24);
|
||||
if (slice_cap2 & DP_DSC_20_PER_DP_DSC_SINK)
|
||||
mask |= drm_dp_dsc_slice_count_to_mask(20);
|
||||
if (slice_cap2 & DP_DSC_16_PER_DP_DSC_SINK)
|
||||
mask |= drm_dp_dsc_slice_count_to_mask(16);
|
||||
}
|
||||
|
||||
/* DP, eDP v1.5+ */
|
||||
if (slice_cap1 & DP_DSC_12_PER_DP_DSC_SINK)
|
||||
mask |= drm_dp_dsc_slice_count_to_mask(12);
|
||||
if (slice_cap1 & DP_DSC_10_PER_DP_DSC_SINK)
|
||||
mask |= drm_dp_dsc_slice_count_to_mask(10);
|
||||
if (slice_cap1 & DP_DSC_8_PER_DP_DSC_SINK)
|
||||
mask |= drm_dp_dsc_slice_count_to_mask(8);
|
||||
if (slice_cap1 & DP_DSC_6_PER_DP_DSC_SINK)
|
||||
mask |= drm_dp_dsc_slice_count_to_mask(6);
|
||||
/* DP, eDP v1.4+ */
|
||||
if (slice_cap1 & DP_DSC_4_PER_DP_DSC_SINK)
|
||||
mask |= drm_dp_dsc_slice_count_to_mask(4);
|
||||
if (slice_cap1 & DP_DSC_2_PER_DP_DSC_SINK)
|
||||
mask |= drm_dp_dsc_slice_count_to_mask(2);
|
||||
if (slice_cap1 & DP_DSC_1_PER_DP_DSC_SINK)
|
||||
mask |= drm_dp_dsc_slice_count_to_mask(1);
|
||||
|
||||
return mask;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dp_dsc_sink_slice_count_mask);
|
||||
|
||||
/**
|
||||
* drm_dp_dsc_sink_max_slice_count() - Get the max slice count
|
||||
* supported by the DSC sink.
|
||||
@@ -2723,43 +2788,7 @@ EXPORT_SYMBOL(drm_dp_dsc_sink_bpp_incr);
|
||||
u8 drm_dp_dsc_sink_max_slice_count(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE],
|
||||
bool is_edp)
|
||||
{
|
||||
u8 slice_cap1 = dsc_dpcd[DP_DSC_SLICE_CAP_1 - DP_DSC_SUPPORT];
|
||||
|
||||
if (is_edp) {
|
||||
/* For eDP, register DSC_SLICE_CAPABILITIES_1 gives slice count */
|
||||
if (slice_cap1 & DP_DSC_4_PER_DP_DSC_SINK)
|
||||
return 4;
|
||||
if (slice_cap1 & DP_DSC_2_PER_DP_DSC_SINK)
|
||||
return 2;
|
||||
if (slice_cap1 & DP_DSC_1_PER_DP_DSC_SINK)
|
||||
return 1;
|
||||
} else {
|
||||
/* For DP, use values from DSC_SLICE_CAP_1 and DSC_SLICE_CAP2 */
|
||||
u8 slice_cap2 = dsc_dpcd[DP_DSC_SLICE_CAP_2 - DP_DSC_SUPPORT];
|
||||
|
||||
if (slice_cap2 & DP_DSC_24_PER_DP_DSC_SINK)
|
||||
return 24;
|
||||
if (slice_cap2 & DP_DSC_20_PER_DP_DSC_SINK)
|
||||
return 20;
|
||||
if (slice_cap2 & DP_DSC_16_PER_DP_DSC_SINK)
|
||||
return 16;
|
||||
if (slice_cap1 & DP_DSC_12_PER_DP_DSC_SINK)
|
||||
return 12;
|
||||
if (slice_cap1 & DP_DSC_10_PER_DP_DSC_SINK)
|
||||
return 10;
|
||||
if (slice_cap1 & DP_DSC_8_PER_DP_DSC_SINK)
|
||||
return 8;
|
||||
if (slice_cap1 & DP_DSC_6_PER_DP_DSC_SINK)
|
||||
return 6;
|
||||
if (slice_cap1 & DP_DSC_4_PER_DP_DSC_SINK)
|
||||
return 4;
|
||||
if (slice_cap1 & DP_DSC_2_PER_DP_DSC_SINK)
|
||||
return 2;
|
||||
if (slice_cap1 & DP_DSC_1_PER_DP_DSC_SINK)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return fls(drm_dp_dsc_sink_slice_count_mask(dsc_dpcd, is_edp));
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dp_dsc_sink_max_slice_count);
|
||||
|
||||
|
||||
@@ -27,7 +27,10 @@ i915-y += \
|
||||
i915_config.o \
|
||||
i915_driver.o \
|
||||
i915_drm_client.o \
|
||||
i915_edram.o \
|
||||
i915_freq.o \
|
||||
i915_getparam.o \
|
||||
i915_gmch.o \
|
||||
i915_ioctl.o \
|
||||
i915_irq.o \
|
||||
i915_mitigations.o \
|
||||
@@ -54,12 +57,6 @@ i915-y += \
|
||||
vlv_iosf_sb.o \
|
||||
vlv_suspend.o
|
||||
|
||||
# core peripheral code
|
||||
i915-y += \
|
||||
soc/intel_dram.o \
|
||||
soc/intel_gmch.o \
|
||||
soc/intel_rom.o
|
||||
|
||||
# core library code
|
||||
i915-y += \
|
||||
i915_memcpy.o \
|
||||
@@ -77,6 +74,12 @@ i915-$(CONFIG_DEBUG_FS) += \
|
||||
i915-$(CONFIG_PERF_EVENTS) += \
|
||||
i915_pmu.o
|
||||
|
||||
# core display adaptation
|
||||
i915-y += \
|
||||
i915_display_pc8.o \
|
||||
i915_hdcp_gsc.o \
|
||||
i915_panic.o
|
||||
|
||||
# "Graphics Technology" (aka we talk to the gpu)
|
||||
gt-y += \
|
||||
gt/gen2_engine_cs.o \
|
||||
@@ -267,6 +270,7 @@ i915-y += \
|
||||
display/intel_dpll_mgr.o \
|
||||
display/intel_dpt.o \
|
||||
display/intel_dpt_common.o \
|
||||
display/intel_dram.o \
|
||||
display/intel_drrs.o \
|
||||
display/intel_dsb.o \
|
||||
display/intel_dsb_buffer.o \
|
||||
@@ -280,7 +284,6 @@ i915-y += \
|
||||
display/intel_frontbuffer.o \
|
||||
display/intel_global_state.o \
|
||||
display/intel_hdcp.o \
|
||||
display/intel_hdcp_gsc.o \
|
||||
display/intel_hdcp_gsc_message.o \
|
||||
display/intel_hotplug.o \
|
||||
display/intel_hotplug_irq.o \
|
||||
@@ -292,7 +295,7 @@ i915-y += \
|
||||
display/intel_modeset_setup.o \
|
||||
display/intel_modeset_verify.o \
|
||||
display/intel_overlay.o \
|
||||
display/intel_panic.o \
|
||||
display/intel_parent.o \
|
||||
display/intel_pch.o \
|
||||
display/intel_pch_display.o \
|
||||
display/intel_pch_refclk.o \
|
||||
@@ -301,6 +304,7 @@ i915-y += \
|
||||
display/intel_pmdemand.o \
|
||||
display/intel_psr.o \
|
||||
display/intel_quirks.o \
|
||||
display/intel_rom.o \
|
||||
display/intel_sbi.o \
|
||||
display/intel_sprite.o \
|
||||
display/intel_sprite_uapi.o \
|
||||
|
||||
@@ -302,7 +302,7 @@ static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
|
||||
{
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
intel_wakeref_t wakeref;
|
||||
struct ref_tracker *wakeref;
|
||||
bool ret;
|
||||
|
||||
wakeref = intel_display_power_get_if_enabled(display,
|
||||
@@ -684,12 +684,11 @@ static void intel_enable_dp(struct intel_atomic_state *state,
|
||||
struct intel_display *display = to_intel_display(state);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
u32 dp_reg = intel_de_read(display, intel_dp->output_reg);
|
||||
intel_wakeref_t wakeref;
|
||||
|
||||
if (drm_WARN_ON(display->drm, dp_reg & DP_PORT_EN))
|
||||
return;
|
||||
|
||||
with_intel_pps_lock(intel_dp, wakeref) {
|
||||
with_intel_pps_lock(intel_dp) {
|
||||
if (display->platform.valleyview || display->platform.cherryview)
|
||||
vlv_pps_port_enable_unlocked(encoder, pipe_config);
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
|
||||
{
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
|
||||
intel_wakeref_t wakeref;
|
||||
struct ref_tracker *wakeref;
|
||||
bool ret;
|
||||
|
||||
wakeref = intel_display_power_get_if_enabled(display,
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include "intel_fb.h"
|
||||
#include "intel_fbc.h"
|
||||
#include "intel_frontbuffer.h"
|
||||
#include "intel_panic.h"
|
||||
#include "intel_plane.h"
|
||||
#include "intel_sprite.h"
|
||||
|
||||
@@ -134,7 +133,7 @@ static struct intel_fbc *i9xx_plane_fbc(struct intel_display *display,
|
||||
enum i9xx_plane_id i9xx_plane)
|
||||
{
|
||||
if (i9xx_plane_has_fbc(display, i9xx_plane))
|
||||
return display->fbc[INTEL_FBC_A];
|
||||
return display->fbc.instances[INTEL_FBC_A];
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
@@ -724,7 +723,7 @@ static bool i9xx_plane_get_hw_state(struct intel_plane *plane,
|
||||
struct intel_display *display = to_intel_display(plane);
|
||||
enum intel_display_power_domain power_domain;
|
||||
enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
|
||||
intel_wakeref_t wakeref;
|
||||
struct ref_tracker *wakeref;
|
||||
bool ret;
|
||||
u32 val;
|
||||
|
||||
@@ -819,7 +818,7 @@ unsigned int vlv_plane_min_alignment(struct intel_plane *plane,
|
||||
{
|
||||
struct intel_display *display = to_intel_display(plane);
|
||||
|
||||
if (intel_plane_can_async_flip(plane, fb->format->format, fb->modifier))
|
||||
if (intel_plane_can_async_flip(plane, fb->format, fb->modifier))
|
||||
return 256 * 1024;
|
||||
|
||||
/* FIXME undocumented so not sure what's actually needed */
|
||||
@@ -843,7 +842,7 @@ static unsigned int g4x_primary_min_alignment(struct intel_plane *plane,
|
||||
{
|
||||
struct intel_display *display = to_intel_display(plane);
|
||||
|
||||
if (intel_plane_can_async_flip(plane, fb->format->format, fb->modifier))
|
||||
if (intel_plane_can_async_flip(plane, fb->format, fb->modifier))
|
||||
return 256 * 1024;
|
||||
|
||||
if (intel_scanout_needs_vtd_wa(display))
|
||||
|
||||
@@ -7,8 +7,6 @@
|
||||
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
#include "soc/intel_dram.h"
|
||||
|
||||
#include "i915_drv.h"
|
||||
#include "i915_reg.h"
|
||||
#include "i9xx_wm.h"
|
||||
@@ -19,6 +17,7 @@
|
||||
#include "intel_display.h"
|
||||
#include "intel_display_regs.h"
|
||||
#include "intel_display_trace.h"
|
||||
#include "intel_dram.h"
|
||||
#include "intel_fb.h"
|
||||
#include "intel_mchbar_regs.h"
|
||||
#include "intel_wm.h"
|
||||
@@ -91,7 +90,7 @@ static const struct cxsr_latency cxsr_latency_table[] = {
|
||||
|
||||
static const struct cxsr_latency *pnv_get_cxsr_latency(struct intel_display *display)
|
||||
{
|
||||
const struct dram_info *dram_info = intel_dram_info(display->drm);
|
||||
const struct dram_info *dram_info = intel_dram_info(display);
|
||||
bool is_ddr3 = dram_info->type == INTEL_DRAM_DDR3;
|
||||
int i;
|
||||
|
||||
|
||||
@@ -1411,7 +1411,7 @@ static void gen11_dsi_disable_io_power(struct intel_encoder *encoder)
|
||||
enum port port;
|
||||
|
||||
for_each_dsi_port(port, intel_dsi->ports) {
|
||||
intel_wakeref_t wakeref;
|
||||
struct ref_tracker *wakeref;
|
||||
|
||||
wakeref = fetch_and_zero(&intel_dsi->io_wakeref[port]);
|
||||
intel_display_power_put(display,
|
||||
@@ -1722,7 +1722,7 @@ static bool gen11_dsi_get_hw_state(struct intel_encoder *encoder,
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
|
||||
enum transcoder dsi_trans;
|
||||
intel_wakeref_t wakeref;
|
||||
struct ref_tracker *wakeref;
|
||||
enum port port;
|
||||
bool ret = false;
|
||||
u32 tmp;
|
||||
|
||||
@@ -326,11 +326,9 @@ static void lnl_alpm_configure(struct intel_dp *intel_dp,
|
||||
if (intel_dp->as_sdp_supported) {
|
||||
u32 pr_alpm_ctl = PR_ALPM_CTL_ADAPTIVE_SYNC_SDP_POSITION_T1;
|
||||
|
||||
if (intel_dp->pr_dpcd[INTEL_PR_DPCD_INDEX(DP_PANEL_REPLAY_CAP_CAPABILITY)] &
|
||||
DP_PANEL_REPLAY_LINK_OFF_SUPPORTED_IN_PR_AFTER_ADAPTIVE_SYNC_SDP)
|
||||
if (crtc_state->link_off_after_as_sdp_when_pr_active)
|
||||
pr_alpm_ctl |= PR_ALPM_CTL_ALLOW_LINK_OFF_BETWEEN_AS_SDP_AND_SU;
|
||||
if (!(intel_dp->pr_dpcd[INTEL_PR_DPCD_INDEX(DP_PANEL_REPLAY_CAP_CAPABILITY)] &
|
||||
DP_PANEL_REPLAY_ASYNC_VIDEO_TIMING_NOT_SUPPORTED_IN_PR))
|
||||
if (crtc_state->disable_as_sdp_when_pr_active)
|
||||
pr_alpm_ctl |= PR_ALPM_CTL_AS_SDP_TRANSMISSION_IN_ACTIVE_DISABLE;
|
||||
|
||||
intel_de_write(display, PR_ALPM_CTL(display, cpu_transcoder),
|
||||
|
||||
@@ -1042,10 +1042,10 @@ int intel_audio_min_cdclk(const struct intel_crtc_state *crtc_state)
|
||||
static unsigned long intel_audio_component_get_power(struct device *kdev)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(kdev);
|
||||
intel_wakeref_t wakeref;
|
||||
struct ref_tracker *wakeref;
|
||||
|
||||
/* Catch potential impedance mismatches before they occur! */
|
||||
BUILD_BUG_ON(sizeof(intel_wakeref_t) > sizeof(unsigned long));
|
||||
BUILD_BUG_ON(sizeof(wakeref) > sizeof(unsigned long));
|
||||
|
||||
wakeref = intel_display_power_get(display, POWER_DOMAIN_AUDIO_PLAYBACK);
|
||||
|
||||
@@ -1074,7 +1074,7 @@ static void intel_audio_component_put_power(struct device *kdev,
|
||||
unsigned long cookie)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(kdev);
|
||||
intel_wakeref_t wakeref = (intel_wakeref_t)cookie;
|
||||
struct ref_tracker *wakeref = (struct ref_tracker *)cookie;
|
||||
|
||||
/* Stop forcing CDCLK to 2*BCLK if no need for audio to be powered. */
|
||||
if (--display->audio.power_refcount == 0)
|
||||
|
||||
@@ -34,14 +34,13 @@
|
||||
#include <drm/drm_fixed.h>
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
#include "soc/intel_rom.h"
|
||||
|
||||
#include "intel_display.h"
|
||||
#include "intel_display_core.h"
|
||||
#include "intel_display_rpm.h"
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_display_utils.h"
|
||||
#include "intel_gmbus.h"
|
||||
#include "intel_rom.h"
|
||||
|
||||
#define _INTEL_BIOS_PRIVATE
|
||||
#include "intel_vbt_defs.h"
|
||||
@@ -2529,6 +2528,54 @@ intel_bios_encoder_reject_edp_rate(const struct intel_bios_encoder_data *devdata
|
||||
return devdata->child.edp_data_rate_override & edp_rate_override_mask(rate);
|
||||
}
|
||||
|
||||
static void sanitize_dedicated_external(struct intel_bios_encoder_data *devdata,
|
||||
enum port port)
|
||||
{
|
||||
struct intel_display *display = devdata->display;
|
||||
|
||||
if (!intel_bios_encoder_is_dedicated_external(devdata))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Since dedicated_external is for ports connected to PHYs outside of
|
||||
* the Type-C subsystem, clear bits that would only make sense for ports
|
||||
* with PHYs in the Type-C subsystem.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Bit dp_usb_type_c is marked as "don't care" in Bspec when
|
||||
* dedicated_external is set.
|
||||
*/
|
||||
if (devdata->child.dp_usb_type_c) {
|
||||
drm_dbg_kms(display->drm,
|
||||
"VBT claims Port %c supports USB Type-C, but the port is dedicated external, ignoring\n",
|
||||
port_name(port));
|
||||
devdata->child.dp_usb_type_c = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Bit tbt is marked as "don't care" in Bspec when dedicated_external is
|
||||
* set.
|
||||
*/
|
||||
if (devdata->child.tbt) {
|
||||
drm_dbg_kms(display->drm,
|
||||
"VBT claims Port %c supports TBT, but the port is dedicated external, ignoring\n",
|
||||
port_name(port));
|
||||
devdata->child.tbt = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* DDI allocation for TC capable ports only make sense for PHYs in the
|
||||
* Type-C subsystem.
|
||||
*/
|
||||
if (devdata->child.dyn_port_over_tc) {
|
||||
drm_dbg_kms(display->drm,
|
||||
"VBT claims Port %c supports dynamic DDI allocation in TCSS, but the port is dedicated external, ignoring\n",
|
||||
port_name(port));
|
||||
devdata->child.dyn_port_over_tc = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void sanitize_device_type(struct intel_bios_encoder_data *devdata,
|
||||
enum port port)
|
||||
{
|
||||
@@ -2693,6 +2740,16 @@ static void print_ddi_port(const struct intel_bios_encoder_data *devdata)
|
||||
supports_typec_usb, supports_tbt,
|
||||
devdata->dsc != NULL);
|
||||
|
||||
if (intel_bios_encoder_is_dedicated_external(devdata))
|
||||
drm_dbg_kms(display->drm,
|
||||
"Port %c is dedicated external\n",
|
||||
port_name(port));
|
||||
|
||||
if (intel_bios_encoder_supports_dyn_port_over_tc(devdata))
|
||||
drm_dbg_kms(display->drm,
|
||||
"Port %c supports dynamic DDI allocation in TCSS\n",
|
||||
port_name(port));
|
||||
|
||||
hdmi_level_shift = intel_bios_hdmi_level_shift(devdata);
|
||||
if (hdmi_level_shift >= 0) {
|
||||
drm_dbg_kms(display->drm,
|
||||
@@ -2750,6 +2807,7 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
|
||||
return;
|
||||
}
|
||||
|
||||
sanitize_dedicated_external(devdata, port);
|
||||
sanitize_device_type(devdata, port);
|
||||
sanitize_hdmi_level_shift(devdata, port);
|
||||
}
|
||||
@@ -2777,7 +2835,7 @@ static int child_device_expected_size(u16 version)
|
||||
{
|
||||
BUILD_BUG_ON(sizeof(struct child_device_config) < 40);
|
||||
|
||||
if (version > 263)
|
||||
if (version > 264)
|
||||
return -ENOENT;
|
||||
else if (version >= 263)
|
||||
return 44;
|
||||
@@ -3721,6 +3779,18 @@ bool intel_bios_encoder_supports_tbt(const struct intel_bios_encoder_data *devda
|
||||
return devdata->display->vbt.version >= 209 && devdata->child.tbt;
|
||||
}
|
||||
|
||||
bool intel_bios_encoder_is_dedicated_external(const struct intel_bios_encoder_data *devdata)
|
||||
{
|
||||
return devdata->display->vbt.version >= 264 &&
|
||||
devdata->child.dedicated_external;
|
||||
}
|
||||
|
||||
bool intel_bios_encoder_supports_dyn_port_over_tc(const struct intel_bios_encoder_data *devdata)
|
||||
{
|
||||
return devdata->display->vbt.version >= 264 &&
|
||||
devdata->child.dyn_port_over_tc;
|
||||
}
|
||||
|
||||
bool intel_bios_encoder_lane_reversal(const struct intel_bios_encoder_data *devdata)
|
||||
{
|
||||
return devdata && devdata->child.lane_reversal;
|
||||
|
||||
@@ -79,6 +79,8 @@ bool intel_bios_encoder_supports_dp(const struct intel_bios_encoder_data *devdat
|
||||
bool intel_bios_encoder_supports_edp(const struct intel_bios_encoder_data *devdata);
|
||||
bool intel_bios_encoder_supports_typec_usb(const struct intel_bios_encoder_data *devdata);
|
||||
bool intel_bios_encoder_supports_tbt(const struct intel_bios_encoder_data *devdata);
|
||||
bool intel_bios_encoder_is_dedicated_external(const struct intel_bios_encoder_data *devdata);
|
||||
bool intel_bios_encoder_supports_dyn_port_over_tc(const struct intel_bios_encoder_data *devdata);
|
||||
bool intel_bios_encoder_supports_dsi(const struct intel_bios_encoder_data *devdata);
|
||||
bool intel_bios_encoder_supports_dp_dual_mode(const struct intel_bios_encoder_data *devdata);
|
||||
bool intel_bios_encoder_is_lspcon(const struct intel_bios_encoder_data *devdata);
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "gem/i915_gem_mman.h"
|
||||
#include "gem/i915_gem_object.h"
|
||||
#include "gem/i915_gem_object_frontbuffer.h"
|
||||
#include "pxp/intel_pxp.h"
|
||||
#include "i915_debugfs.h"
|
||||
#include "intel_bo.h"
|
||||
|
||||
@@ -29,6 +30,11 @@ bool intel_bo_is_protected(struct drm_gem_object *obj)
|
||||
return i915_gem_object_is_protected(to_intel_bo(obj));
|
||||
}
|
||||
|
||||
int intel_bo_key_check(struct drm_gem_object *obj)
|
||||
{
|
||||
return intel_pxp_key_check(obj, false);
|
||||
}
|
||||
|
||||
int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
|
||||
{
|
||||
return i915_gem_fb_mmap(to_intel_bo(obj), vma);
|
||||
|
||||
@@ -16,6 +16,7 @@ bool intel_bo_is_tiled(struct drm_gem_object *obj);
|
||||
bool intel_bo_is_userptr(struct drm_gem_object *obj);
|
||||
bool intel_bo_is_shmem(struct drm_gem_object *obj);
|
||||
bool intel_bo_is_protected(struct drm_gem_object *obj);
|
||||
int intel_bo_key_check(struct drm_gem_object *obj);
|
||||
int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
|
||||
int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, int size);
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
#include <drm/drm_atomic_state_helper.h>
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
#include "soc/intel_dram.h"
|
||||
|
||||
#include "i915_drv.h"
|
||||
#include "i915_reg.h"
|
||||
#include "intel_bw.h"
|
||||
@@ -16,6 +14,7 @@
|
||||
#include "intel_display_regs.h"
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_display_utils.h"
|
||||
#include "intel_dram.h"
|
||||
#include "intel_mchbar_regs.h"
|
||||
#include "intel_pcode.h"
|
||||
#include "intel_uncore.h"
|
||||
@@ -800,7 +799,7 @@ static unsigned int icl_qgv_bw(struct intel_display *display,
|
||||
|
||||
void intel_bw_init_hw(struct intel_display *display)
|
||||
{
|
||||
const struct dram_info *dram_info = intel_dram_info(display->drm);
|
||||
const struct dram_info *dram_info = intel_dram_info(display);
|
||||
|
||||
if (!HAS_DISPLAY(display))
|
||||
return;
|
||||
|
||||
@@ -28,10 +28,7 @@
|
||||
#include <drm/drm_fixed.h>
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
#include "soc/intel_dram.h"
|
||||
|
||||
#include "hsw_ips.h"
|
||||
#include "i915_drv.h"
|
||||
#include "i915_reg.h"
|
||||
#include "intel_atomic.h"
|
||||
#include "intel_audio.h"
|
||||
@@ -42,11 +39,13 @@
|
||||
#include "intel_display_regs.h"
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_display_utils.h"
|
||||
#include "intel_dram.h"
|
||||
#include "intel_mchbar_regs.h"
|
||||
#include "intel_pci_config.h"
|
||||
#include "intel_pcode.h"
|
||||
#include "intel_plane.h"
|
||||
#include "intel_psr.h"
|
||||
#include "intel_step.h"
|
||||
#include "intel_vdsc.h"
|
||||
#include "skl_watermark.h"
|
||||
#include "skl_watermark_regs.h"
|
||||
@@ -668,7 +667,7 @@ static void vlv_set_cdclk(struct intel_display *display,
|
||||
{
|
||||
int cdclk = cdclk_config->cdclk;
|
||||
u32 val, cmd = cdclk_config->voltage_level;
|
||||
intel_wakeref_t wakeref;
|
||||
struct ref_tracker *wakeref;
|
||||
int ret;
|
||||
|
||||
switch (cdclk) {
|
||||
@@ -758,7 +757,7 @@ static void chv_set_cdclk(struct intel_display *display,
|
||||
{
|
||||
int cdclk = cdclk_config->cdclk;
|
||||
u32 val, cmd = cdclk_config->voltage_level;
|
||||
intel_wakeref_t wakeref;
|
||||
struct ref_tracker *wakeref;
|
||||
int ret;
|
||||
|
||||
switch (cdclk) {
|
||||
@@ -3738,10 +3737,8 @@ static int pch_rawclk(struct intel_display *display)
|
||||
|
||||
static int i9xx_hrawclk(struct intel_display *display)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
|
||||
/* hrawclock is 1/4 the FSB frequency */
|
||||
return DIV_ROUND_CLOSEST(intel_fsb_freq(i915), 4);
|
||||
return DIV_ROUND_CLOSEST(intel_fsb_freq(display), 4);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -85,7 +85,6 @@ static bool intel_cmtg_transcoder_is_secondary(struct intel_display *display,
|
||||
enum transcoder trans)
|
||||
{
|
||||
enum intel_display_power_domain power_domain;
|
||||
intel_wakeref_t wakeref;
|
||||
u32 val = 0;
|
||||
|
||||
if (!HAS_TRANSCODER(display, trans))
|
||||
@@ -93,7 +92,7 @@ static bool intel_cmtg_transcoder_is_secondary(struct intel_display *display,
|
||||
|
||||
power_domain = POWER_DOMAIN_TRANSCODER(trans);
|
||||
|
||||
with_intel_display_power_if_enabled(display, power_domain, wakeref)
|
||||
with_intel_display_power_if_enabled(display, power_domain)
|
||||
val = intel_de_read(display, TRANS_DDI_FUNC_CTL2(display, trans));
|
||||
|
||||
return val & CMTG_SECONDARY_MODE;
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
/*
|
||||
* Copyright © 2025 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "intel_colorop.h"
|
||||
#include "intel_display_types.h"
|
||||
|
||||
struct intel_colorop *to_intel_colorop(struct drm_colorop *colorop)
|
||||
{
|
||||
|
||||
@@ -6,7 +6,9 @@
|
||||
#ifndef __INTEL_COLOROP_H__
|
||||
#define __INTEL_COLOROP_H__
|
||||
|
||||
#include "intel_display_types.h"
|
||||
enum intel_color_block;
|
||||
struct drm_colorop;
|
||||
struct intel_colorop;
|
||||
|
||||
struct intel_colorop *to_intel_colorop(struct drm_colorop *colorop);
|
||||
struct intel_colorop *intel_colorop_alloc(void);
|
||||
|
||||
@@ -156,27 +156,17 @@ void intel_connector_destroy(struct drm_connector *connector)
|
||||
int intel_connector_register(struct drm_connector *_connector)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(_connector);
|
||||
struct drm_i915_private *i915 = to_i915(_connector->dev);
|
||||
int ret;
|
||||
|
||||
ret = intel_panel_register(connector);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
if (i915_inject_probe_failure(i915)) {
|
||||
ret = -EFAULT;
|
||||
goto err_panel;
|
||||
}
|
||||
return ret;
|
||||
|
||||
intel_connector_debugfs_add(connector);
|
||||
|
||||
return 0;
|
||||
|
||||
err_panel:
|
||||
intel_panel_unregister(connector);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
ALLOW_ERROR_INJECTION(intel_connector_register, ERRNO);
|
||||
|
||||
void intel_connector_unregister(struct drm_connector *_connector)
|
||||
{
|
||||
|
||||
@@ -109,7 +109,7 @@ static bool intel_crt_get_hw_state(struct intel_encoder *encoder,
|
||||
{
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_crt *crt = intel_encoder_to_crt(encoder);
|
||||
intel_wakeref_t wakeref;
|
||||
struct ref_tracker *wakeref;
|
||||
bool ret;
|
||||
|
||||
wakeref = intel_display_power_get_if_enabled(display,
|
||||
@@ -847,7 +847,7 @@ intel_crt_detect(struct drm_connector *connector,
|
||||
struct intel_crt *crt = intel_attached_crt(to_intel_connector(connector));
|
||||
struct intel_encoder *encoder = &crt->base;
|
||||
struct drm_atomic_state *state;
|
||||
intel_wakeref_t wakeref;
|
||||
struct ref_tracker *wakeref;
|
||||
int status;
|
||||
|
||||
drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] force=%d\n",
|
||||
@@ -936,7 +936,7 @@ static int intel_crt_get_modes(struct drm_connector *connector)
|
||||
struct intel_display *display = to_intel_display(connector->dev);
|
||||
struct intel_crt *crt = intel_attached_crt(to_intel_connector(connector));
|
||||
struct intel_encoder *encoder = &crt->base;
|
||||
intel_wakeref_t wakeref;
|
||||
struct ref_tracker *wakeref;
|
||||
struct i2c_adapter *ddc;
|
||||
int ret;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user